Ho un errore nel mio programma: "impossibile convertire da stringa a char *". Come si esegue questa conversione?Come si converte una stringa in un char * in C++?
risposta
Se si può accontentare di un const char*
, basta chiamare il metodo c_str()
su di esso:
const char *mycharp = mystring.c_str();
Se davvero bisogno di un modificabile char*
, è necessario fare una copia del buffer della stringa. Un vector
è un modo ideale di gestire questo per voi:
std::vector<char> v(mystring.length() + 1);
std::strcpy(&v[0], mystring.c_str());
char* pc = &v[0];
Invoke str.c_str()
per ottenere un const char*
:
const char *pch = str.c_str();
Si noti che la risultante const char*
solo fino al str
è cambiato o distrutti.
Tuttavia, se si ha realmente bisogno di un non- const
, probabilmente non dovrebbe usare std::string
, in quanto non è stato progettato per consentire la modifica i dati sottostanti dietro la schiena. Detto questo, puoi ottenere un puntatore ai suoi dati invocando &str[0]
o &*str.begin()
.
La bruttezza di questo dovrebbe essere considerata una caratteristica. In C++ 98, std::string
non è nemmeno richiesto di archiviare i suoi dati in un blocco contiguo di memoria, quindi questo potrebbe esplodere in faccia. Penso che sia cambiato, ma non riesco nemmeno a ricordare se fosse per C++ 03 o la prossima versione dello standard, C++ 1x.
Se è necessario, prendere in considerazione l'utilizzo di std::vector<char>
. Puoi accedere ai suoi dati allo stesso modo: &v[0]
o &*v.begin()
.
Utilizzare il metodo c_str()
su un oggetto string
per ottenere un puntatore const char*
. Avviso: il puntatore restituito non è più valido se l'oggetto string
viene modificato o distrutto.
std::string::c_str()
restituisce una stringa c con lo stesso contenuto dell'oggetto string
.
std::string str("Hello");
const char* cstr = str.c_str();
Dal momento che si voleva andare da un string
ad un char*
(vale a dire, non un const char*
) si può fare questo ma attenzione: There Be Dragons qui:
string foo = "foo";
char* foo_c = &foo[0];
Se si tenta di modificare il contenuto della stringa, stai bene e veramente da solo.
Il problema non è solo la modifica dei contenuti: il contenuto di una stringa non è garantito come contiguo, quindi potrebbe non funzionare affatto. – CiscoIPPhone
Potrei essermi sbagliato, in base alla risposta accettata a questa domanda, è garantito che sia contiguo nel nuovo standard: http://stackoverflow.com/questions/1986966/does-s0-point-to-contenuto-characters-in -a-stdstring – CiscoIPPhone
Se const char*
è buono per voi allora utilizza questo: myString.c_str()
Se davvero bisogno char*
e sa per certo che char*
non cambierà, allora è possibile utilizzare questo: const_cast<char*>(myString.c_str())
Se char*
potrebbe cambiare allora si è necessario copiare la stringa in qualcos'altro e utilizzarla al suo posto. Che qualcos'altro potrebbe essere std::vector
o new char[]
, dipende dalle vostre esigenze.
//assume you have an std::string, str.
char* cstr = new char[str.length() +1];
strcpy(cstr, str.c_str());
//eventually, remember to delete cstr
delete[] cstr;
Si prega di inviare un esempio di codice. – superfro
NESSUNO delle risposte postate risponde alla domanda effettiva. –
grazie a tutti ragazzi, funziona! – Ptichka