Jak przekonwertować tablicę char na ciąg?

254

Konwersja C ++ stringna tablicę char jest dość prosta przy użyciu c_strfunkcji string, a następnie wykonania strcpy. Jak jednak zrobić odwrotnie?

Muszę tablica znak jak: char arr[ ] = "This is a test";być przekonwertowany na adres: string str = "This is a test.

kingsmasher1
źródło

Odpowiedzi:

369

stringKlasa ma konstruktora, że trwa C-ciąg 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;
Tajemniczy
źródło
2
To i tak działałoby. Przeciążony operator przypisania przyjmuje const char*tablicę literałów łańcuchowych lub znaków char (która się do tego zmniejsza).
Tajemniczy
3
@ kingsmasher1: Ściśle mówiąc, ciągi w formie "hello world" tablicami. Jeśli sizeof("hello world")go użyjesz , otrzymasz rozmiar tablicy (która wynosi 12), a nie rozmiar wskaźnika (prawdopodobnie 4 lub 8).
dreamlax
7
Zauważ, że działa to tylko dla ciągów C ciągłych zakończonych znakiem NULL. stringKonstruktor nie będzie działać z, na przykład, przeszedł ciąg argumentu zadeklarowana jako unsigned char * buffer, coś bardzo powszechne w strumień bajtów obsługi bibliotek.
CXJ
4
Nic nie musi być stałe. Jeśli masz bufor bajtowy dowolnego typu char, możesz użyć innego konstruktora:, std::string str(buffer, buffer+size);ale prawdopodobnie lepiej trzymać się std::vector<unsigned char>w takim przypadku.
R. Martinho Fernandes
2
Chociaż może to być oczywiste: strto nie nawrócony funkcja tutaj. Jest to nazwa zmiennej łańcuchowej. Możesz użyć dowolnej innej nazwy zmiennej (np string foo(arr);.). Konwersja jest wykonywana przez konstruktor std :: string, który jest wywoływany niejawnie.
Christopher K.,
55

Inne rozwiązanie może wyglądać tak:

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

co pozwala uniknąć użycia dodatkowej zmiennej.

stackPusher
źródło
Czy możesz wskazać w odpowiedzi, w jaki sposób różni się ona od przyjętej odpowiedzi, mój Misticial?
Maarten Bodewes
@owlstead proszę zobaczyć edycję. Po prostu podaję swoją odpowiedź, ponieważ chciałbym to zobaczyć, kiedy pierwszy raz natknąłem się na tę stronę w poszukiwaniu odpowiedzi. Jeśli ktoś tak samo głupi jak ja natknie się na tę stronę, ale nie będzie w stanie nawiązać połączenia z pierwszą odpowiedzią, mam nadzieję, że moja odpowiedź mu pomoże.
stackPusher
5
Ponieważ string () jest konstruktorem std :: string, warto wspomnieć, że musisz dodać przestrzeń nazw std na wypadek, gdybyś nie używał przestrzeni nazw std. Przykład:cout << "test:" + std::string(arr);
Christopher K.
1
@ChristopherK. Pominąłem to, ponieważ tak też najwyżej oceniona odpowiedź. Moja odpowiedź ma być uzupełnieniem tej odpowiedzi, więc zachowałem te same założenia. Mam nadzieję, że każdy, kto tego nie rozumie, zobaczy Twój komentarz
stackPusher
Czy str jest nazwą zmiennej, czy jest klucz, którego mogę tutaj użyć string aString(someChar);?
Driss Bounouar
31

W odpowiedziach, na które najczęściej głosowano, jest niewielki problem. Mianowicie tablica znaków może zawierać 0. Jeśli użyjemy konstruktora z jednym parametrem, jak wskazano powyżej, stracimy część danych. Możliwe rozwiązanie to:

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

Dane wyjściowe to:

123
123 123

Yola
źródło
2
To lepsza odpowiedź, jeśli używasz std::stringjako kontenera danych binarnych i nie możesz być pewien, że tablica nie zawiera „\ 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;
}

NA ZEWNĄTRZ:

H : is a char array beginning with 17 chars long

Hello from Chile. :is a string with 17 chars long
Cristian
źródło
Gdzie jest darmowy (tmp)? czy sznurek się tym zajmuje?
huseyin tugrul buyukisik
1
dobre pytanie. Myślę, że powinno być wolne, ponieważ używam malloc.
Cristian