std::cadena a char*

8 minutos de lectura

quiero convertir un estándar::cadena en un carbonizarse* o carbonizarse[] tipo de datos.

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

Resultados en: “error: no se puede convertir ‘std::string’ a ‘char’…”.

¿Qué métodos hay disponibles para hacer esto?

  • ¿Responde esto a tu pregunta? Cómo convertir un std::string a const char* o char*

    – cabeza

    24 de junio de 2021 a las 14:05

stdcadena a char
orlp

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

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

Tenga en cuenta que devuelve un const char *; no se le permite cambiar la cadena de estilo C devuelta por c_str(). Si quieres procesarlo tendrás que copiarlo primero:

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

O en C++ moderno:

std::vector<char> cstr(str.c_str(), str.c_str() + str.size() + 1);

  • @Kerrek SB: fue un ejemplo, usaría un puntero inteligente en código real, o más probablemente evitaría esto c_str locura por completo.

    – orlp

    8 sep 2011 a las 17:37

  • La respuesta es voluminosa, poco elegante, no local, utiliza matrices sin procesar y requiere atención a la seguridad de excepciones. vector fue inventado precisamente como un envoltorio para matrices dinámicas, por lo que no usarlo parece, en el mejor de los casos, una oportunidad perdida y, en el peor, una violación del espíritu de C++.

    – KerrekSB

    8 sep 2011 a las 20:11

  • En primer lugar, sí, la respuesta es voluminosa. Primero explico el error del OP (pensando que std::string convertiría automáticamente) y luego le explico lo que debería usar, con una muestra de código corto. Pensando en el futuro, también explico algunos efectos secundarios del uso de esta función, uno de los cuales es que no puede editar la cadena devuelta por c_str(). Por error, ve mis ejemplos breves como un código real de resolución de problemas, que no lo es.

    – orlp

    8 sep 2011 a las 20:19

  • Voté negativamente la respuesta. De hecho, esta respuesta no es útil y el hecho de que haya sido aceptada es muy desafortunado. Esta respuesta ignora por completo las buenas prácticas de programación de C ++ y la seguridad de excepciones, y existen soluciones muy superiores, algunas de las cuales se brindan en otras respuestas a esta pregunta (por ejemplo, la respuesta dada por ildjarn que usa std::vector<char>).

    –James McNellis

    8 sep 2011 a las 20:27


  • @ james-mcnellis, elegí esta respuesta como la correcta porque respondía EXACTAMENTE lo que estaba pidiendo… Ni más, ni menos. No pedí lo que crees que debo hacer, no pedí una solución diferente para lo que crees que estoy haciendo, no pedí buenas prácticas. No tienes idea en qué estoy trabajando, dónde se implementará mi código y bajo qué condiciones. Algunos deberían aprender a leer, comprender preguntas y responder a lo que realmente se les pregunta. No hay necesidad de presumir aquí.

    usuario912695

    9 de septiembre de 2011 a las 16:19

1646968571 591 stdcadena a char
bobobobo

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

string str = "some string" ;
char *cstr = &str[0];

A partir de C++11, también puede utilizar el str.data() función miembro, que devuelve char *

string str = "some string" ;
char *cstr = str.data();

  • FWIW, en mi libro, esta es la única respuesta correcta a la pregunta que realmente se hizo. Una std::string es intrínsecamente mutable: las personas que hacen que parezca que modificar el contenido de la cadena es de alguna manera obra del diablo parecen estar pasando por alto este hecho.

    – Jay Freeman -saurik-

    4 de octubre de 2013 a las 1:25


  • si, esta es la respuesta correcta. es una tontería que, dada la frecuencia de uso, no haya un método estándar para hacer esto, como lockbuffer de msoft.

    – Erik Aronesty

    28 de enero de 2015 a las 17:24

  • Cambié 0 a 0u. Debido a que algunos compiladores/bibliotecas (créanlo o no) se quejan de cierta ambigüedad cuando las advertencias están completamente activadas para &str[0] construir

    – Erik Aronesty

    28 de enero de 2015 a las 18:05

  • Tenga en cuenta que esto es solo C++ 11. Es posible que las versiones anteriores no tengan almacenamiento continuo o que les falte el nulo de terminación

    – Llama de fuego

    29 de junio de 2017 a las 20:14

  • Este es el único que funcionó para mí, por alguna razón c_str() Seguí deteniéndome en mis bytes nulos a pesar de que mi lectura parece indicar que no debería. Tal vez hice algo más mal en otro lugar, pero cambiar c_str() con esto (o incluso &str.first()) funcionó perfectamente

    – Brian Leishmann

    6 de agosto de 2018 a las 13:36

stdcadena a char
Unidad central nórdica

Si necesitaría una copia sin formato mutable del contenido de una cadena de c ++, entonces haría esto:

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

y después:

free(chr); 

Entonces, ¿por qué no juego con std::vector o new?[] como alguien mas? Porque cuando necesito una cadena mutable de char * sin formato de estilo C, entonces porque quiero llamar al código C que cambia la cadena y el código C desasigna cosas con free() y asigna con malloc() (strdup usa malloc). Entonces, si paso mi cadena sin procesar a alguna función X escrito en c eso puede que tener una restricción en su argumento que tiene que asignarse en el montón (por ejemplo, si la función quisiera llamar a realloc en el parámetro). Pero es muy poco probable que espere un argumento asignado con (algunos redefinidos por el usuario) nuevos[]!

  • deberias explicar donde strdup es desde.

    – LF

    8 mayo 2019 a las 10:31

1646968572 974 stdcadena a char
ildjarn

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

Por favor, no use un crudo char*.

std::string str = "string";
std::vector<char> chars(str.c_str(), str.c_str() + str.size() + 1u);
// use &chars[0] as a char*

stdcadena a char
Carreras de ligereza en órbita

  • Si solo desea una cadena de estilo C que represente el mismo contenido:

    char const* ca = str.c_str();
    
  • Si desea una cadena de estilo C con nuevo contenidos, una forma (dado que no conoce el tamaño de la cadena en tiempo de compilación) es la asignació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[] eso mas tarde.

  • Si desea una matriz de longitud limitada asignada estáticamente:

    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 no convierte implícitamente a estos tipos por la sencilla razón de que la necesidad de hacer esto suele ser un olor de diseño. asegúrese de que usted De Verdad necesito.

Si usted definitivamente necesitar un char*los mejor la forma es probablemente:

vector<char> v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector

  • Por qué &str.front(), &str.back() (que no están presentes en C++03) en lugar de los más comunes str.begin() y str.end()?

    – Armen Tsirunyan

    08/09/2011 a las 17:30

  • qué pasa str.begin()o incluso std::begin(str), iterador-como? no creo string tiene ninguna obligación de estar en la memoria contigua como vectoro lo tiene?

    – xtofl

    8 sep 2011 a las 17:33

  • @xtofl: ya los edité. Y sí, a partir de C++ 11 hay una obligación; esto estaba implícito en C++03.

    – Carreras de ligereza en órbita

    8 sep 2011 a las 17:34


  • @xtofl: No en C++03. En C++ 11 tenemos esa garantía, junto con las funciones front() y back(), que de todos modos fueron mal utilizadas en la respuesta original.

    – Armen Tsirunyan

    08/09/2011 a las 17:35

  • @Tomalak: Fueron mal utilizados porque necesitabas &back() + 1no &back()

    – Armen Tsirunyan

    8 sep 2011 a las 17:39


Esto sería mejor como comentario sobre la respuesta de bobobobo, pero no tengo el representante para eso. Logra lo mismo pero con mejores prácticas.

Aunque las otras respuestas son útiles, si alguna vez necesita convertir std::string para 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 darle una copia de los datos; le dará un puntero a la cadena. Así, si modificas un elemento de chrvas a modificar str.

  • Por qué &str.front(), &str.back() (que no están presentes en C++03) en lugar de los más comunes str.begin() y str.end()?

    – Armen Tsirunyan

    08/09/2011 a las 17:30

  • qué pasa str.begin()o incluso std::begin(str), iterador-como? no creo string tiene ninguna obligación de estar en la memoria contigua como vectoro lo tiene?

    – xtofl

    8 sep 2011 a las 17:33

  • @xtofl: ya los edité. Y sí, a partir de C++ 11 hay una obligación; esto estaba implícito en C++03.

    – Carreras de ligereza en órbita

    8 sep 2011 a las 17:34


  • @xtofl: No en C++03. En C++ 11 tenemos esa garantía, junto con las funciones front() y back(), que de todos modos fueron mal utilizadas en la respuesta original.

    – Armen Tsirunyan

    08/09/2011 a las 17:35

  • @Tomalak: Fueron mal utilizados porque necesitabas &back() + 1no &back()

    – Armen Tsirunyan

    8 sep 2011 a las 17:39


1646968573 811 stdcadena a char
Marca B

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

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad