2010-11-11 14 views

Respuesta

22

Si puede conformarse con un const char*, sólo tiene que llamar al método c_str() en él:

const char *mycharp = mystring.c_str(); 

Si realmente necesita un modificable char*, tendrá que hacer una copia del búfer de la cadena. Un vector es una forma ideal de manejar para el usuario:

std::vector<char> v(mystring.length() + 1); 
std::strcpy(&v[0], mystring.c_str()); 
char* pc = &v[0];
14

invocación str.c_str() para obtener un const char*:

const char *pch = str.c_str(); 

Tenga en cuenta que la const char* resultante sólo es válida hasta str se cambia o destruidas.


Sin embargo, si usted realmente necesita un no const, probablemente no debería utilizar std::string, ya que no fue diseñado para permitir el cambio de sus datos subyacentes detrás de su espalda. Dicho esto, puede obtener un puntero a sus datos invocando &str[0] o &*str.begin().

Lo feo de esto debería considerarse una característica. En C++ 98, std::string ni siquiera es necesario almacenar sus datos en un bloque contiguo de memoria, por lo que podría explotar en su cara. Creo que ha cambiado, pero ni siquiera puedo recordar si esto fue para C++ 03 o la próxima próxima versión del estándar, C++ 1x.

Si necesita hacer esto, considere usar un std::vector<char> en su lugar. Puede acceder a sus datos de la misma manera: &v[0] o &*v.begin().

3

Utilice el método c_str() en un objeto string para obtener un puntero const char*. Advertencia: El puntero devuelto ya no es válido si el objeto string se modifica o se destruye.

1

std::string::c_str() devuelve una cadena de caracteres con el mismo contenido que el objeto string.

std::string str("Hello"); 
const char* cstr = str.c_str(); 
3

Desde quería ir desde una string a un char* (es decir, no un const char*) se puede hacer esto, pero ten cuidado: hay dragones aquí:

string foo = "foo"; 
char* foo_c = &foo[0]; 

Si intenta modificar el contenido de la cuerda, estás bien y verdaderamente solo.

+0

El problema no es solo modificar los contenidos: no se garantiza que el contenido de una cadena sea contiguo, por lo que podría no funcionar en absoluto. – CiscoIPPhone

+0

Puedo estar equivocado allí, de acuerdo con la respuesta aceptada a esta pregunta, se garantiza que sea contiguo en el nuevo estándar: http://stackoverflow.com/questions/1986966/does-s0-point-to-contiguous-characters-in -a-stdstring – CiscoIPPhone

2

Si const char* es buena para usted entonces utiliza esta: myString.c_str()

Si realmente necesita char* y sabe con seguridad que char* no cambiará entonces usted puede utilizar esto: const_cast<char*>(myString.c_str())

Si char* puede cambiar entonces necesita copiar la cadena en otra cosa y usarla en su lugar. Ese algo más puede ser std::vector o new char[], depende de sus necesidades.

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; 
Cuestiones relacionadas