Ich muss ein verwenden std::string
, um Daten zu speichern, die von abgerufen wurden fgets()
. Dazu muss ich den char*
Rückgabewert von fgets()
in in konvertieren std::string
, um ihn in einem Array zu speichern. Wie kann das gemacht werden?
Ich muss ein verwenden std::string
, um Daten zu speichern, die von abgerufen wurden fgets()
. Dazu muss ich den char*
Rückgabewert von fgets()
in in konvertieren std::string
, um ihn in einem Array zu speichern. Wie kann das gemacht werden?
Antworten:
std::string
hat einen Konstruktor dafür:
const char *s = "Hello, World!";
std::string str(s);
Beachten Sie, dass dieses Konstrukt die Zeichenliste tief kopiert s
und s
nicht sein sollte nullptr
, sonst ist das Verhalten undefiniert.
str
ist nur ein Variablenname. Es könnte alles sein: S
, abc
, l
, I
, strHelloWorld
. Offensichtlich sind einige Entscheidungen besser als andere. Aber für dieses Beispiel str
ist das durchaus akzeptabel.
Wenn Sie die Größe des Zeichens * bereits kennen, verwenden Sie diese stattdessen
char* data = ...;
int size = ...;
std::string myString(data, size);
Dies verwendet keine strlen.
BEARBEITEN: Wenn bereits eine Zeichenfolgenvariable vorhanden ist, verwenden Sie assign ():
std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
Die meisten Antworten sprechen vom Konstruieren std::string
.
Wenn bereits erstellt, verwenden Sie einfach den Zuweisungsoperator .
std::string oString;
char* pStr;
... // Here allocate and get character string (e.g. using fgets as you mentioned)
oString = pStr; // This is it! It copies contents from pStr to oString
Geben Sie es durch den Konstruktor weiter:
const char* dat = "my string!";
std::string my_string( dat );
Sie können die Funktion string.c_str () verwenden, um in die andere Richtung zu gehen:
std::string my_string("testing!");
const char* dat = my_string.c_str();
c_str()
kehrt zurückconst char*
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;
Ich möchte eine neue Methode erwähnen, die das benutzerdefinierte Literal verwendet s
. Dies ist nicht neu, wird jedoch häufiger auftreten, da es in der C ++ 14-Standardbibliothek hinzugefügt wurde.
Im allgemeinen Fall weitgehend überflüssig:
string mystring = "your string here"s;
Sie können jedoch auch Auto verwenden, auch mit breiten Zeichenfolgen:
auto mystring = U"your UTF-32 string here"s;
Und hier scheint es wirklich:
string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;
Ich habe gerade mit MSVC2005 gekämpft, um den std::string(char*)
Konstruktor genau wie die am besten bewertete Antwort zu verwenden. Wie ich sehe, ist diese Variante unter http://en.cppreference.com/w/cpp/string/basic_string/basic_string als Nummer 4 aufgeführt ich, dass dies sogar ein alter Compiler anbietet.
Es hat so lange gedauert, bis mir klar wurde, dass dieser Konstruktor absolut nicht (unsigned char*)
als Argument übereinstimmt ! Ich habe diese unverständlichen Fehlermeldungen über die Nichtübereinstimmung mit dem std::string
Argumenttyp erhalten, was definitiv nicht das war, was ich anstrebte. Nur das Argument mit zu werfen, std::string((char*)ucharPtr)
löste mein Problem ... duh!
char* data;
std::string myString(data);
data
bleibt nicht initialisiert (leer).
Ich bin mir nicht sicher, warum niemand außer Erik dies erwähnt hat, aber laut dieser Seite funktioniert der Zuweisungsoperator einwandfrei. Sie müssen keinen Konstruktor, .assign () oder .append () verwenden.
std::string mystring;
mystring = "This is a test!"; // Assign C string to std:string directly
std::cout << mystring << '\n';
=
(und +=
) stammten . Es scheint nicht mit solchen Literalen zu passieren, sondern nur mit char*
Dingen. Die Frage, ob solche Berichte tatsächlich undicht sind , wird hier erörtert . Aber wenn ich die Zuordnung zum destString = std::string(srcCharPtr);
Valgrind geändert habe, sind Leckberichte verschwunden. YMMV.
Constructs an object of class basic_string and determines its initial string value from the array
. Es sagt Wert und nichts über Puffer oder Zeigerbesitz.