¿Cuál es el uso de la función c_str en c ++?

5 minutos de lectura

¿Cual es el uso de la funcion c str en c
Amit Singh Tomar

Acabo de empezar a leer C++ y descubrí que c++ tiene funciones ricas para la manipulación de cadenas que C no tiene. Estoy leyendo estas funciones y encontré c_str() y por lo que entiendo es c_str convertir una cadena que puede terminar en nulo o puede no serlo en una cadena terminada en nulo. ¿Es cierto?

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

¿Cual es el uso de la funcion c str en c
Jon

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

Por ejemplo, considere este código:

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

std::size_t pos2 = static_cast<std::size_t>(std::strchr(string.c_str(), 'w') - string.c_str());

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

Véalo en acción.

Notas:

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

  • Punto muy interesante que hiciste en Notas: ¿qué me gustaría saber si std::string ya está contenido \0 entonces c_str también agrega \0 al final de la cadena?

    – Amit Singh Tomar

    14 de septiembre de 2011 a las 12:46

  • @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

    14 de septiembre de 2011 a las 12:47

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

    – Matthieu M.

    14 de septiembre de 2011 a las 13:19

  • Esto no está funcionando: string str("0.85"); newVolume = _tstof((TCHAR*)str.c_str()); ¿Cómo puedo convertir TCHAR* argv?[] ingrese 0.85 en eso?

    usuario285594

    31 de enero de 2017 a las 11:24

  • @YumYumYum no puedes usar std::string junto con las cosas de TCHAR, el objetivo de TCHAR es cambiar automáticamente entre char/wchar mientras std::string funciona solo en términos de char. Tendrá que usar una abstracción adecuada, o simplemente no usar TCHAR en absoluto y siempre hacer una compilación Unicode.

    – Jon

    31 de enero de 2017 a las 13:35

En C++, define sus cadenas como

std::string MyString;

en lugar de

char MyString[20];.

Mientras escribe código C++, encuentra algunas funciones C que requieren una cadena C como parámetro.
Como abajo:

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

Ahora hay un problema. Estás trabajando con C++ y estás usando std::string variables de cadena Pero esta función C pide una cadena C. ¿Cómo conviertes tu std::string a una cadena C estándar?

Me gusta esto:

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

Esto es lo que c_str() es para.

Tenga en cuenta que, para std::wstring instrumentos de cuerda, c_str() devuelve un const w_char *.

¿Cual es el uso de la funcion c str en c
Daniel Mosmondor

La mayoría de las funciones ANTIGUAS de c++ y c, cuando se trata de cadenas, usan const char*.
Con STL y std::string, string.c_str() se introduce para poder convertir de std::string para const char*.

Eso significa que si promete no cambiar el búfer, podrá usar contenidos de cadena de solo lectura. PROMESA = constante carbonizarse*

  • @No existe tal cosa como stl::string. De hecho, ni siquiera existe algo así como “STL” que no sea en un museo en alguna parte.

    – KerrekSB

    14 de septiembre de 2011 a las 12:42

En la programación C/C++ hay dos tipos de cadenas: las cadenas C y las cadenas estándar. Con el <string> encabezado, 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 el c_str() función.

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

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

  • Yo no diría “conversos”. Más bien, la función “brinda acceso” a una matriz de caracteres de solo lectura adecuada, muy probablemente una matriz que siempre ha estado presente en la implementación de std::string para empezar.

    – KerrekSB

    14 de septiembre de 2011 a las 12:41


1646754015 427 ¿Cual es el uso de la funcion c str en c
pmr

se usa para hacer std::string interoperable con código C que requiere una terminación nula char*.

  • Yo no diría “conversos”. Más bien, la función “brinda acceso” a una matriz de caracteres de solo lectura adecuada, muy probablemente una matriz que siempre ha estado presente en la implementación de std::string para empezar.

    – KerrekSB

    14 de septiembre de 2011 a las 12:41


Oh, debo agregar mi propia selección aquí, usará esto cuando codifique / decodifique algún objeto de cadena que transfiera entre dos programas.

Digamos que usa base64encode alguna matriz en python, y luego quiere decodificar eso en c ++. Una vez que tenga la cadena, la decodificará de base64decode en C++. Para que vuelva a la matriz de flotación, todo lo que necesita hacer aquí es

float arr[1024];
memcpy(arr, ur_string.c_str(), sizeof(float) * 1024);

Esto es un uso bastante común, supongo.

  • Ese tipo de código no es portátil (endianness y formato flotante, entre otros)

    – Phil1970

    3 de noviembre de 2019 a las 23:43

¿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