2011-09-14 17 views
35

Acabo de empezar a leer C++ y encontré que C++ tiene funciones ricas para la manipulación de cadenas que C no tiene. Estoy leyendo esta función y me encontré con c_str() y por lo que entiendo es c_str convierta una cadena que puede ser terminada nula o puede no ser una cadena terminada nula. ¿Es verdadera?¿Qué es el uso de la función c_str? En C++

¿Alguien puede sugerirme un ejemplo para que pueda entender el uso de c_str función?

Respuesta

54

c_str devuelve un const char* que apunta a una cadena terminada en nulo (es decir, una cadena de estilo C). Es útil cuando quiere pasar los "contenidos" ¹ de un std::string a una función que espera trabajar con una cadena estilo C.

Por ejemplo, considere este código:

std::string str("Hello world!"); 
int pos1 = str.find_first_of('w'); 

int pos2 = strchr(str.c_str(), 'w') - str.c_str(); 

if (pos1 == pos2) { 
    printf("Both ways give the same result.\n"); 
} 

See it in action.

Notas:

¹ Esto no es del todo cierto, ya que un std::string (a diferencia de una cadena C) puede contener el carácter \0. Si lo hace, el código que recibe el valor de retorno de c_str() se engañará al pensar que la cadena es más corta de lo que realmente es, ya que interpretará \0 como el final de la cadena.

+0

punto muy interesante que ha hecho en Notas: Lo que me gustaría saber si std :: string es ya contenía \ 0, entonces c_str también agrega \ 0 al final de la cadena ?? –

+2

@AmitSinghTomar: Sí, entonces tendrá dos bytes nulos, uno que es legítimamente parte de la cadena y otro que se supone que es el terminador nulo. Pero la función de estilo c que recibe el puntero no lo sabe. – Jon

+0

Nota: un número de C-API solicitará dos argumentos ('char const *, size_t'), el segundo es el tamaño, por supuesto. –

2

c_str() convierte una cadena de C++ en una cadena de estilo C que es esencialmente una matriz de bytes terminada en nulo. Lo usa cuando quiere pasar una cadena de C++ a una función que espera una cadena de estilo C (por ejemplo, una gran cantidad de API Win32, funciones de estilo POSIX, etc.).

+2

No diría "conversos". Más bien, la función "proporciona acceso" a una matriz de caracteres de solo lectura adecuada, muy probablemente una matriz que siempre ha estado allí en la implementación de 'std :: string' para empezar. –

4

La mayoría de las funciones ANTERIORES de C++ yc, cuando se trata de cadenas de caracteres, usa const char*.
Con STL y std::string, string.c_str() se presenta para poder convertir de std::string a const char*.

Eso significa que si promete no cambiar el búfer, podrá usar el contenido de cadenas de solo lectura. PROMESA = const char *

+0

@ No existe tal cosa como 'stl :: string'. De hecho, ni siquiera hay algo como "STL" en un museo en algún lugar. –

2

Se utiliza para hacer std::string interoperable con código C que requiere un terminada en nulo char*.

29

En C++, a definir sus cadenas como

std::string MyString;

en lugar de

char MyString[20];.

Al escribir código C++, se encuentran algunas funciones C que requieren cadena C como parámetro.
, como a continuación:

void IAmACFunction(int abc, float bcd, const char * cstring);

Ahora no es un problema. Estás trabajando con C++ y estás usando std::string variables de cadena. Pero esta función C está pidiendo una cadena C.¿Cómo convertir su std::string a una cadena estándar de C?

De esta manera:

std::string MyString; 
// ... 
MyString = "Hello world!"; 
// ... 
IAmACFunction(5, 2.45f, MyString.c_str()); 

Esto es lo que es para c_str().

Tenga en cuenta que, para std::wstring cadenas, c_str() devuelve const w_char *.

0

En la programación C/C++ hay dos tipos de cadenas: las cadenas C y las cadenas estándar. Con el encabezado <string>, podemos usar las cadenas estándar. Por otro lado, las cadenas C son solo una matriz de caracteres normales. Entonces, para convertir una cadena estándar en una cadena C, usamos la función c_str().

por ejemplo

// a string to a C-style string conversion// 

const char *cstr1 = str1.c_str(); 
cout<<"Operation: *cstr1 = str1.c_str()"<<endl; 
cout<<"The C-style string c_str1 is: "<<cstr1<<endl; 
cout<<"\nOperation: strlen(cstr1)"<<endl; 
cout<<"The length of C-style string str1 = "<<strlen(cstr1)<<endl; 

Y la salida será,

Operation: *cstr1 = str1.c_str() 
The C-style string c_str1 is: Testing the c_str 
Operation: strlen(cstr1) 
The length of C-style string str1 = 17 
Cuestiones relacionadas