¿Cómo convertir una matriz de caracteres en una cadena?

254

Convertir un C ++ stringen una matriz de caracteres es bastante sencillo usando la c_strfunción de cadena y luego haciendo strcpy. Sin embargo, ¿cómo hacer lo contrario?

Tengo una matriz de caracteres como: char arr[ ] = "This is a test";a de ser reconvertido a: string str = "This is a test.

kingsmasher1
fuente

Respuestas:

369

La stringclase tiene un constructor que toma una cadena en C terminada en NULL:

char arr[ ] = "This is a test";

string str(arr);


//  You can also assign directly to a string.
str = "This is another string";

// or
str = arr;
Místico
fuente
2
Aún funcionaría de cualquier manera. El operador de asignación sobrecargado toma un const char*, por lo que puede pasarle un literal de cadena o una matriz de caracteres (que se descompone en eso).
Mysticial
3
@ kingsmasher1: Estrictamente hablando, las cadenas en el formulario "hello world" son matrices. Si lo usa sizeof("hello world"), le dará el tamaño de la matriz (que es 12), en lugar del tamaño de un puntero (probablemente 4 u 8).
dreamlax
77
Tenga en cuenta que esto solo funciona para cadenas C terminadas en NULL constantes . El stringconstructor no funcionará, por ejemplo, con una cadena de argumento aprobada declarada como unsigned char * bufferalgo muy común en las bibliotecas de manejo de flujo de bytes.
CXJ
44
No hay necesidad de que nada sea constante. Si tiene un búfer de bytes de cualquier tipo char, puede usar el otro constructor: std::string str(buffer, buffer+size);pero probablemente sea mejor quedarse con a std::vector<unsigned char>en ese caso.
R. Martinho Fernandes
2
Aunque puede ser obvio: nostr es una función de conversión aquí. Es el nombre de la variable de cadena. Puede usar cualquier otro nombre de variable (por ejemplo ). La conversión la realiza el constructor de std :: string que se llama implícitamente. string foo(arr);
Christopher K.
55

Otra solución podría verse así,

char arr[] = "mom";
std::cout << "hi " << std::string(arr);

que evita usar una variable extra.

stackPusher
fuente
¿Podría indicar en la respuesta cómo esto es diferente de la respuesta aceptada mi Misticial?
Maarten Bodewes
@owlstead por favor vea la edición. Simplemente pongo mi respuesta porque es lo que desearía ver cuando encontré esta página por primera vez en busca de una respuesta. Si alguien tan tonto como yo se encuentra con esta página pero no puede hacer esa conexión al mirar la primera respuesta, espero que mi respuesta los ayude.
stackPusher
55
Como string () es el constructor de std :: string, vale la pena mencionar que necesita agregar el std de espacio de nombres en caso de que no esté usando el espacio de nombres std. Ejemplo:cout << "test:" + std::string(arr);
Christopher K.
1
@ChristopherK. Lo dejé fuera porque también lo hizo la respuesta mejor calificada. Mi respuesta está destinada a ser un complemento de esa respuesta, así que mantuve los mismos supuestos. Con suerte alguien que imposible entender que verá su comentario
stackPusher
¿Es str un nombre de variable o es una clave aquí podría usar string aString(someChar);?
Driss Bounouar
31

Hay un pequeño problema perdido en las respuestas más votadas. Es decir, la matriz de caracteres puede contener 0. Si usaremos el constructor con un solo parámetro como se indicó anteriormente, perderemos algunos datos. La posible solución es:

cout << string("123\0 123") << endl;
cout << string("123\0 123", 8) << endl;

Salida es:

123
123 123

Yola
fuente
2
Esta es una mejor respuesta si está utilizando std::stringun contenedor para datos binarios y no puede estar seguro de que la matriz no contiene '\ 0'.
Assil Ksiksi
11
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string>

using namespace std;

int main ()
{
  char *tmp = (char *)malloc(128);
  int n=sprintf(tmp, "Hello from Chile.");

  string tmp_str = tmp;


  cout << *tmp << " : is a char array beginning with " <<n <<" chars long\n" << endl;
  cout << tmp_str << " : is a string with " <<n <<" chars long\n" << endl;

 free(tmp); 
 return 0;
}

FUERA:

H : is a char array beginning with 17 chars long

Hello from Chile. :is a string with 17 chars long
Cristian
fuente
¿Dónde está gratis (tmp)? ¿Se encarga la cadena de eso?
huseyin tugrul buyukisik
1
buena pregunta. Creo que free debería estar allí porque estoy usando malloc.
Cristian