Quiero convertir un std::string en un tipo de datos **char* o char[]**.
std::string str = "string";
char* chr = str;
El resultado es: "error: no se puede convertir 'std::string' en 'char'... ".
¿Qué métodos hay disponibles para hacer esto?
No se convertirá automáticamente (gracias a Dios). Tendrá que utilizar el método c_str()
para obtener la versión de cadena en C.
std::string str = "string";
const char *cstr = str.c_str();
Ten en cuenta que devuelve un const char *
; no puedes cambiar la cadena de estilo C devuelta por c_str()
. Si quiere procesarla tendrá que copiarla 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);
Si sólo quieres una cadena estilo C que represente el mismo contenido:
char const* ca = str.c_str();
Si quieres una cadena estilo C con nuevo contenido, una forma (dado que no conoces 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()] = '\N- 0';
No te olvides de borrar[]
después.
Si quieres un array estáticamente asignado y de longitud limitada en su lugar:
size_t const MAX = 80; // número máximo de caracteres
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 hacerlo suele ser un olor de diseño. Asegúrate de que lo necesitas realmente.
Si definitivamente necesitas un char*
, la mejor manera es probablemente:
vector<char> v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector