2011-01-21 14 views
23

¿Cuál es la mejor forma de convertir una cadena de estilo C en C++ std::string? En el pasado lo he hecho usando stringstream s. ¿Hay una mejor manera?Conversión de una cadena de estilo C en C++ std :: string

+0

¿Qué es un cstring? ¿Te refieres a un 'CString' de MFC? ¿O una matriz de caracteres terminados en nulo (una cadena C)? ¿O algo mas? –

Respuesta

41

C cadenas ++ tienen un constructor que le permite convertir cadenas estilo C:

char* myStr = "This is a C string!"; 
std::string myCppString = myStr; 
+0

y ahora también tengo que hacer 'delete myStr;' no? –

+0

@BarnabasSzabolcs No, eso no es necesario. Solo necesita borrar la memoria asignada con la nueva. Los punteros a los literales de cadena no necesitan desasignarse. – templatetypedef

+0

Veo, así que estoy acertando, string hace una copia interna de este char *. –

3

Puede inicializar un std::string directamente desde un C-string:

std::string s = "i am a c string"; 
std::string t = std::string("i am one too"); 
5

Verificar los diferentes constructores de la clase de cadena: documentation Quizás le interese:

//string(char* s) 
std::string str(cstring); 

Y:

//string(char* s, size_t n) 
std::string str(cstring, len_str); 
4

Si se refiere a char*-std::string, puede utilizar el constructor.

char* a; 
std::string s(a); 

O si el string s ya existen, sólo tiene que escribir esto:

s=std::string(a); 
+1

No. Su ejemplo arrojaría un error lógico en el constructor de std :: string. 'a' no puede ser NULL. –

1

En general (sin declarar un nuevo almacenamiento) sólo se puede utilizar el constructor 1-arg cambiar el c-cadena en una cadena de valor p:

string xyz = std::string("this is a test") + 
      std::string(" for the next 60 seconds ") + 
      std::string("of the emergency broadcast system."); 

sin embargo, esto no funciona cuando se construye la cadena de pasarlo por referencia a una función (un problema que acabo de encontrar), por ejemplo,

void ProcessString(std::string& username); 
ProcessString(std::string("this is a test")); // fails 

Usted necesita para tomar la referencia de una referencia constante:

void ProcessString(const std::string& username); 
ProcessString(std::string("this is a test")); // works. 
3

C++11: sobrecargar un operador literal de cadena

std::string operator ""_s(const char * str, std::size_t len) { 
    return std::string(str, len); 
} 

auto s1 = "abc\0\0def";  // C style string 
auto s2 = "abc\0\0def"_s; // C++ style std::string 

C++14: Utilice el operador de std::string_literals espacio de nombres

using namespace std::string_literals; 

auto s3 = "abc\0\0def"s; // is a std::string 
Cuestiones relacionadas