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 1wie 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 hbis zum letzten zurück p(beide inklusive)temp.c_str()oder temp.data()wird mit einem nullTerminator zurückkehrenint(temp[temp.size()])wird Null seinIch weiß, ich ähnlich klingen hier , um einige der Antworten , aber ich möchte darauf hinweisen , dass sizeder std::stringin C++wird separat gehalten und es ist nicht wie in Cdem Sie das Zählen halten , wenn Sie die erste finden nullTerminator.
Um hinzuzufügen, wäre die Geschichte ein wenig anders, wenn Ihre string literalenthält eingebettet \0. In diesem Fall std::stringstoppt die Konstruktion des ersten nullZeichens 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 tempmö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 \0Zeichen enthält. Abgesehen davon sehe ich nicht wirklich, wie nützlich es für eine C ++ - Zeichenfolge wäre
std::stringintern 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.