Enthält die folgende Zeichenfolge den Nullterminator '\ 0'?
std::string temp = "hello whats up";
Vielen Dank! :) :)
Enthält die folgende Zeichenfolge den Nullterminator '\ 0'?
std::string temp = "hello whats up";
Vielen Dank! :) :)
Antworten:
Nein, aber wenn Sie sagen, dass temp.c_str()
ein Nullterminator in der Rückgabe dieser Methode enthalten ist.
Es ist auch erwähnenswert, dass Sie wie jedes andere Zeichen ein Nullzeichen in eine Zeichenfolge einfügen können.
string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';
druckt
5 5
und nicht 5 1
wie zu erwarten, wenn Nullzeichen eine besondere Bedeutung für Zeichenfolgen haben.
temp.c_str()
das Nullzeichen aufrufen , wird es eingeschlossen. Wenn Sie es wirklich in der Zeichenfolge benötigen, fügen Sie es einfach wie jedes andere Zeichen hinzu. temp.push_back('\0')
. Jetzt temp.c_str()
gehören zwei Nullzeichen.
Nicht in C ++ 03, und es wird nicht einmal vor C ++ 11 garantiert, dass in einem C ++ std :: string im Speicher fortlaufend ist. Nur C-Strings (char-Arrays, die zum Speichern von Strings vorgesehen sind) hatten den Null-Terminator.
In C ++ 11 und höher mystring.c_str()
ist äquivalent zu mystring.data()
äquivalent zu &mystring[0]
und mystring[mystring.size()]
ist garantiert '\0'
.
Dies hängt von Ihrer Definition von "enthalten" hier ab. Im
std::string temp = "hello whats up";
Es gibt einige Dinge zu beachten:
temp.size()
gibt die Anzahl der Zeichen vom ersten h
bis zum letzten zurück p
(beide inklusive)temp.c_str()
oder temp.data()
wird mit einem null
Terminator zurückkehrenint(temp[temp.size()])
wird Null seinIch weiß, ich ähnlich klingen hier , um einige der Antworten , aber ich möchte darauf hinweisen , dass size
der std::string
in C++
wird separat gehalten und es ist nicht wie in C
dem Sie das Zählen halten , wenn Sie die erste finden null
Terminator.
Um hinzuzufügen, wäre die Geschichte ein wenig anders, wenn Ihre string literal
enthält eingebettet \0
. In diesem Fall std::string
stoppt die Konstruktion des ersten null
Zeichens wie folgt:
std::string s1 = "ab\0\0cd"; // s1 contains "ab", using string literal
std::string s2{"ab\0\0cd", 6}; // s2 contains "ab\0\0cd", using different ctr
std::string s3 = "ab\0\0cd"s; // s3 contains "ab\0\0cd", using ""s operator
Verweise:
Ja, wenn Sie aufrufen temp.c_str()
, wird eine nullterminierte C-Zeichenfolge zurückgegeben.
Die tatsächlich im Objekt gespeicherten Daten sind temp
möglicherweise nicht nullterminiert, aber es spielt keine Rolle und sollte für den Programmierer keine Rolle spielen, denn wenn der Programmierer dies wünscht const char*
, würde er c_str()
das Objekt aufrufen , das garantiert null zurückgibt -terminierte Zeichenfolge.
temp.size()
.
Mit C ++ - Zeichenfolgen müssen Sie sich darüber keine Gedanken machen, und dies hängt möglicherweise von der Implementierung ab.
Mit erhalten temp.c_str()
Sie eine C-Darstellung der Zeichenfolge, die definitiv das \0
Zeichen enthält. Abgesehen davon sehe ich nicht wirklich, wie nützlich es für eine C ++ - Zeichenfolge wäre
std::string
intern zählt die Anzahl der Zeichen. Intern funktioniert es mit dieser Zählung. Wie andere gesagt haben, wenn Sie die Zeichenfolge für die Anzeige benötigen oder aus welchem Grund auch immer, können Sie ihre c_str()
Methode verwenden, die Ihnen die Zeichenfolge mit dem Nullterminator am Ende gibt.