2010-11-11 1 views

risposta

22

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];
14

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().

3

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.

1

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(); 
3

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.

+0

Il problema non è solo la modifica dei contenuti: il contenuto di una stringa non è garantito come contiguo, quindi potrebbe non funzionare affatto. – CiscoIPPhone

+0

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

2

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.

8
//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;