Std :: string to char *

Quiero convertir std :: string a char * o char [] tipo de datos.

 std::string str = "string"; char* chr = str; 

Resultados en: "error: imposible convertir 'std :: string a' char ..." .

¿Qué métodos existen para esto?

194
08 сент. Mario set 08 sept. 2011-09-08 20:25 '11 a las 20:25 2011-09-08 20:25
@ 15 respuestas

No se convertirá automáticamente (gracias a Dios). Deberá usar el método c_str() para obtener la versión de la cadena C.

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

Tenga en cuenta que devuelve const char * ; no se le permite cambiar la cadena de estilo C devuelta por c_str() . Si quieres procesarlo, primero cópialo:

 std::string str = "string"; char *cstr = new char[str.length() + 1]; strcpy(cstr, str.c_str()); // do stuff delete [] cstr; 

O en el moderno C ++:

 std::vector<char> cstr(str.c_str(), str.c_str() + str.size() + 1); 
419
08 сент. La respuesta se da orlp 08 de septiembre 2011-09-08 20:27 '11 a las 20:27 2011-09-08 20:27

Más aquí y aquí , pero puedes usar

border=0
 string str = "some string" ; char *cstr = > 
87
12 мая '13 в 0:43 2013-05-12 00:43 la respuesta la da bobobobo el 12 de mayo de '13 a las 0:43 2013-05-12 00:43

Si necesito una copia en bruto mutable de los contenidos de la cadena C ++, haría lo siguiente:

 std::string str = "string"; char* chr = strdup(str.c_str()); 

y después:

 free(chr); 

Entonces, ¿por qué no jugar con std :: vector o new [] como cualquier otra persona? Porque cuando necesito una cadena de caracteres char * cambiable en un estilo C, entonces quiero llamar a un código C que cambia la cadena, y el código C libera el material con free () y extrae con malloc () (strdup usa malloc). Por lo tanto, si paso mi cadena original a alguna función X escrita en C, puede tener una restricción en su argumento, que debería asignar en el montón (por ejemplo, si la función puede querer llamar realloc para el parámetro). ¡Pero es poco probable que él espere que el argumento sea asignado (por algún usuario anulado) al nuevo []!

21
08 сент. La respuesta se da Nordic Mainframe 08 sep. 2011-09-08 21:17 '11 a las 21:17 2011-09-08 21:17

(Esta respuesta solo se aplica a C ++ 98.)

Por favor, no utilice raw char* .

 std::string str = "string"; std::vector<char> chars(str.c_str(), str.c_str() + str.size() + 1u); // use  as a char* 
13
08 сент. respuesta dada ildjarn 08 sept. 2011-09-08 20:29 '11 a las 20:29 2011-09-08 20:29
  • Si solo quieres que la cadena de estilo C represente el mismo contenido:

     char const* ca = str.c_str(); 
  • Si necesita una cadena de estilo C con nuevo contenido, una de las formas (si no sabe el tamaño de la cadena en el momento de la compilación) es una distribución dinámica:

     char* ca = new char[str.size()+1]; std::copy(str.begin(), str.end(), ca); ca[str.size()] = '\0'; 

    No te olvides de delete[] más tarde.

  • Si necesita una matriz distribuida estáticamente con longitud limitada:

     size_t const MAX = 80; // maximum number of chars char ca[MAX] = {}; std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca); 

std::string convierte implícitamente a estos tipos por la sencilla razón de que normalmente es necesario oler el diseño. Asegúrese de que realmente lo necesita.

Si definitivamente necesitas char* , la mejor manera es:

 vector<char> v(str.begin(), str.end()); char* ca =  // pointer to start of vector 
9
08 сент. La respuesta se da a las razas de luminosidad en órbita 08 sep. 2011-09-08 20:27 '11 a las 20:27 2011-09-08 20:27

Suponiendo que solo necesita una cadena de estilo C para la entrada como entrada:

 std::string str = "string"; const char* chr = str.c_str(); 
4
08 сент. Respuesta dada por Mark B 08 Sep. 2011-09-08 20:27 '11 a las 20:27 2011-09-08 20:27

Para ser estrictamente pedante, no puede "convertir el tipo de datos std :: string a char * o char []".

Como se ha mostrado en otras respuestas, puede copiar el contenido de la matriz std :: string en la matriz char o crear un carácter const const * para el contenido de std :: string para que pueda acceder a él "Estilo C".

Si está intentando cambiar el contenido de std :: string, el tipo std :: string tiene todos los métodos para hacer todo lo que necesite hacer.

Si intentas pasarlo a alguna función que acepte char *, hay std :: string :: c_str ().

4
08 сент. La respuesta está dada por Rob K 08 Sep. 2011-09-08 21:03 '11 a las 21:03 2011-09-08 21:03

Eso sería mejor como un comentario a la respuesta bobobobo, pero no tengo reputación para esto. Él hace lo mismo, pero con la mejor práctica.

Si bien otras respuestas son útiles, si alguna vez necesitas convertir std::string a char* explícitamente sin const, const_cast es tu amigo.

 std::string str = "string"; char* chr = const_cast<char*>(str.c_str()); 

Tenga en cuenta que esto no le proporcionará una copia de los datos; Él te dará un puntero a la cuerda. Entonces, si cambias el elemento chr , cambias el str .

4
18 февр. respuesta dada hairlessbear 18 feb. 2017-02-18 02:12 '17 a las 2:12 2017-02-18 02:12

Para completar, no olvide std::string::copy() .

 std::string str = "string"; const size_t MAX = 80; char chrs[MAX]; str.copy(chrs, MAX); 

std::string::copy() no termina con un NUL. Si necesita proporcionar un terminador NUL para su uso en las funciones de cadena C:

 std::string str = "string"; const size_t MAX = 80; char chrs[MAX]; memset(chrs, '\0', MAX); str.copy(chrs, MAX-1); 
2
12 мая '13 в 3:43 2013-05-12 03:43 Jeffery Thomas da la respuesta el 12 de mayo de 2013 a las 3:43 2013-05-12 03:43

Alternativamente, puede usar vectores para obtener un carácter escribible *, como se muestra a continuación:

 //this handles memory manipulations and is more convenient string str; vector <char> writable (str.begin (), str.end) ; writable .push_back ('\0'); char* cstring =  //or  () //Goodluck 
2
09 дек. La respuesta la da el usuario 5616653 09 dic. 2015-12-09 03:46 '15 a las 3:46 2015-12-09 03:46

Aquí hay otra versión confiable de Protocol Buffer

 char* string_as_array(string* str) { return str->empty() ? NULL :  } // test codes std::string mystr("you are here"); char* pstr = string_as_array( cout << pstr << endl; // you are here 
2
16 дек. La respuesta se da zangw 16 dec. 2015-12-16 12:18 '15 a las 12:18 2015-12-16 12:18
 char* result = strcpy((char*)malloc(str.length()+1), str.c_str()); 
1
17 июля '14 в 11:00 2014-07-17 11:00 la respuesta se da cegprakash 17 de julio de 2014 a las 11:00 2014-07-17 11:00

Puedes hacer esto con un iterador.

 std::string str = "string"; std::string::iterator p=str.begin(); char* chr = > 

Buena suerte

1
09 марта '16 в 13:24 2016-03-09 13:24 la respuesta se da TS.PARK 09 de marzo de 2016 a las 13:24 2016-03-09 13:24

Esto también funcionará.

 std::string s; std::cout<<"Enter the String"; std::getline(std::cin, s); char *a=new char[s.size()+1]; a[s.size()]=0; memcpy(a,s.c_str(),s.size()); std::cout<<a; 
1
28 мая '13 в 10:59 2013-05-28 10:59 la respuesta se da Genocide_Hoax 28 de mayo, 13 a las 10:59 2013-05-28 10:59

La versión segura de orlp char * responde con unique_ptr:

 std::string str = "string"; auto cstr = std::make_unique<char[]>(str.length() + 1); strcpy(cstr.get(), str.c_str()); 
0
25 июня '16 в 12:11 2016-06-25 12:11 La respuesta la da Enhex el 25 de junio de 2016 a las 12:11 2016-06-25 12:11

Otras preguntas sobre etiquetas o Haz una pregunta