Como converter uma matriz de caracteres em uma string?

254

A conversão de um C ++ stringem uma matriz de caracteres é bem direta, usando a c_strfunção de string e depois o fazendo strcpy. No entanto, como fazer o oposto?

I têm uma matriz de char como: char arr[ ] = "This is a test";para ser convertido de volta para: string str = "This is a test.

kingsmasher1
fonte

Respostas:

369

A stringclasse possui um construtor que usa uma cadeia C terminada em 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;
Mysticial
fonte
2
Ainda funcionaria de qualquer maneira. O operador de atribuição sobrecarregado recebe um const char*, para que você possa transmitir uma string literal ou matriz de caracteres (que decai para isso).
Mysticial 22/01/12
3
@ kingsmasher1: Estritamente falando, as strings no formulário "hello world" são matrizes. Se você usá- sizeof("hello world")lo, fornecerá o tamanho da matriz (que é 12), em vez do tamanho de um ponteiro (provavelmente 4 ou 8).
dreamlax
7
Observe que isso funciona apenas para strings C terminadas em NULL constantes . O stringconstrutor não funcionará com, por exemplo, uma sequência de argumentos passada declarada como unsigned char * bufferalgo muito comum nas bibliotecas de manipulação de fluxo de bytes.
CXJ 27/03
4
Não há necessidade de algo ser constante. Se você possui um buffer de bytes de qualquer tipo, você pode usar o outro construtor:, std::string str(buffer, buffer+size);mas provavelmente é melhor manter um std::vector<unsigned char>nesse caso.
R. Martinho Fernandes
2
Embora possa ser óbvio: nãostr é uma função de conversão aqui. É o nome da variável de sequência. Você pode usar qualquer outro nome de variável (por exemplo ). A conversão é feita pelo construtor de std :: string chamado implicitamente. string foo(arr);
Christopher K.
55

Outra solução pode ser assim,

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

o que evita o uso de uma variável extra.

stackPusher
fonte
Você poderia indicar na resposta como isso é diferente da resposta aceita meu Misticial?
Maarten Bodewes
@owlstead, veja a edição. Simplesmente coloquei minha resposta porque é o que eu gostaria de ver quando me deparei com esta página procurando uma resposta. Se alguém tão burro quanto eu aparecer nesta página, mas não conseguir estabelecer essa conexão, olhando para a primeira resposta, espero que minha resposta os ajude.
stackPusher
5
Como string () é o construtor de std :: string, vale a pena mencionar que você precisa adicionar o espaço para nome std, caso não esteja usando o espaço para nome std. Exemplo:cout << "test:" + std::string(arr);
Christopher K.
1
@ChristopherK. Eu deixei isso de fora porque a resposta mais bem avaliada também. Minha resposta deve ser um complemento para essa resposta, por isso mantive as mesmas suposições. Espero que qualquer pessoa que não entenda isso verá o seu comentário
stack overflow
Str é um nome de variável ou é uma chave aqui eu poderia usar string aString(someChar);?
Driss Bounouar
31

Um pequeno problema foi esquecido nas respostas mais votadas. Ou seja, a matriz de caracteres pode conter 0. Se usarmos o construtor com um único parâmetro conforme indicado acima, perderemos alguns dados. A solução possível é:

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

A saída é:

123
123 123

Yola
fonte
2
Essa é uma resposta melhor se você estiver usando std::stringcomo um contêiner para dados binários e não puder ter certeza de que a matriz não contém '\ 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;
}

FORA:

H : is a char array beginning with 17 chars long

Hello from Chile. :is a string with 17 chars long
Cristian
fonte
Onde é gratuito (tmp)? string cuida disso?
huseyin tugrul buyukisik
1
boa pergunta. Eu acho que o free deveria estar lá porque eu estou usando malloc.
Cristian