Wie konvertiere ich ein char-Array in einen String?

254

Das Konvertieren eines C ++ stringin ein char-Array ist mit der c_strFunktion string schnell und dann ganz einfach strcpy. Wie macht man das Gegenteil?

Ich habe ein char-Array wie char arr[ ] = "This is a test";:, das zurück konvertiert werden soll in : string str = "This is a test.

kingsmasher1
quelle

Antworten:

369

Die stringKlasse verfügt über einen Konstruktor, der eine NULL-terminierte C-Zeichenfolge verwendet:

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;
Mystisch
quelle
2
Es würde immer noch so oder so funktionieren. Der überladene Zuweisungsoperator nimmt ein const char*, sodass Sie ihm ein String-Literal oder ein char-Array übergeben können (das in dieses zerfällt).
Mysticial
3
@ kingsmasher1: Streng genommen Strings in der Form "hello world" sind Arrays. Wenn Sie sizeof("hello world")es verwenden, erhalten Sie die Größe des Arrays (12) und nicht die Größe eines Zeigers (wahrscheinlich 4 oder 8).
Dreamlax
7
Beachten Sie, dass dies nur für konstante NULL-terminierte C-Strings funktioniert . Der stringKonstruktor arbeitet beispielsweise nicht mit einer übergebenen Argumentzeichenfolge, die als deklariert ist unsigned char * buffer, was in Byte-Stream-Handling-Bibliotheken sehr häufig vorkommt.
CXJ
4
Es ist nicht nötig, dass etwas konstant ist. Wenn Sie einen Bytepuffer eines beliebigen Zeichentyps haben, können Sie den anderen Konstruktor verwenden : std::string str(buffer, buffer+size);, aber std::vector<unsigned char>in diesem Fall ist es wahrscheinlich besser, sich an einen zu halten .
R. Martinho Fernandes
2
Obwohl es offensichtlich sein könnte: strist hier keine Konvertierungsfunktion. Dies ist der Name der Zeichenfolgenvariablen. Sie können einen anderen Variablennamen verwenden (z string foo(arr);. B. ). Die Konvertierung erfolgt durch den Konstruktor von std :: string, der implizit aufgerufen wird.
Christopher K.
55

Eine andere Lösung könnte so aussehen:

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

Dadurch wird die Verwendung einer zusätzlichen Variablen vermieden.

stackPusher
quelle
Könnten Sie in der Antwort angeben, wie sich dies von der akzeptierten Antwort my Misticial unterscheidet?
Maarten Bodewes
@owlstead siehe die Bearbeitung. Ich habe einfach meine Antwort eingegeben, weil ich wünschte, ich hätte sie gesehen, als ich zum ersten Mal auf diese Seite stieß und nach einer Antwort suchte. Wenn jemand, der genauso dumm ist wie ich, auf diese Seite stößt, aber diese Verbindung nicht herstellen kann, wenn er sich die erste Antwort ansieht, hoffe ich, dass meine Antwort ihm hilft.
stackPusher
5
Da string () der Konstruktor von std :: string ist, sollte erwähnt werden, dass Sie den Namespace std hinzufügen müssen, falls Sie den std-Namespace nicht verwenden. Beispiel:cout << "test:" + std::string(arr);
Christopher K.
1
@ChristopherK. Ich habe das weggelassen, weil auch die bestbewertete Antwort. Meine Antwort soll eine Ergänzung zu dieser Antwort sein, daher habe ich die gleichen Annahmen beibehalten. Hoffentlich wird jeder, der das nicht versteht, Ihren Kommentar sehen
stackPusher
Ist str ein Variablenname oder ist hier ein Schlüssel, den ich verwenden könnte string aString(someChar);?
Driss Bounouar
31

Bei den Antworten mit den höchsten Stimmen fehlt ein kleines Problem. Das Zeichenarray kann nämlich 0 enthalten. Wenn wir einen Konstruktor mit einem einzelnen Parameter verwenden, wie oben angegeben, gehen einige Daten verloren. Die mögliche Lösung ist:

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

Ausgabe ist:

123
123 123

Yola
quelle
2
Dies ist eine bessere Antwort, wenn Sie std::stringals Container für Binärdaten verwenden und nicht sicher sein können, dass das Array nicht '\ 0' enthält.
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;
}

AUS:

H : is a char array beginning with 17 chars long

Hello from Chile. :is a string with 17 chars long
Cristian
quelle
Wo ist kostenlos (tmp)? kümmert sich String darum?
Huseyin Tugrul Buyukisik
1
gute Frage. Ich denke, frei sollte da sein, weil ich malloc benutze.
Cristian