Czy poniższy ciąg będzie zawierał terminator zerowy „\ 0”?
std::string temp = "hello whats up";
Dzięki! :)
Czy poniższy ciąg będzie zawierał terminator zerowy „\ 0”?
std::string temp = "hello whats up";
Dzięki! :)
Odpowiedzi:
Nie, ale jeśli powiesz, że temp.c_str()w wyniku zwracanym z tej metody zostanie uwzględniony terminator zerowy.
Warto również powiedzieć, że możesz umieścić znak null w ciągu, tak jak każdy inny znak.
string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';
wydruki
5 5
a nie 5 1tak, jak można by się spodziewać, gdyby znaki puste miały specjalne znaczenie dla łańcuchów.
temp.c_str()znak null zostanie uwzględniony. Jeśli naprawdę potrzebujesz tego w ciągu, po prostu dodaj go jak każdy inny znak. temp.push_back('\0'). Teraz temp.c_str()będzie zawierać dwa znaki null.
Nie w C ++ 03 i nie jest nawet gwarantowane przed C ++ 11, że w C ++ std :: string jest ciągła w pamięci. Tylko ciągi C (tablice char, które są przeznaczone do przechowywania ciągów) miały terminator zerowy.
W C ++ 11 i nowszych mystring.c_str()wersjach mystring.data()jest równoważne jest równoważne &mystring[0]i mystring[mystring.size()]gwarantuje, że będzie '\0'.
Zależy to od Twojej definicji „zawiera”. W
std::string temp = "hello whats up";
jest kilka rzeczy, na które należy zwrócić uwagę:
temp.size()zwróci liczbę znaków od pierwszego hdo ostatniego p(łącznie)temp.c_str()lub temp.data()powróci z nullterminatoremint(temp[temp.size()])będzie wynosić zeroWiem, brzmię podobnie do niektórych odpowiedzi tutaj, ale chcę zwrócić uwagę, że sizeof std::stringin C++jest utrzymywane osobno i nie jest tak, jak w Cprzypadku liczenia, dopóki nie znajdziesz pierwszego nullterminatora.
Aby dodać, historia byłaby trochę inna, gdyby string literalzawierała osadzone \0. W tym przypadku konstrukcja std::stringzatrzymuje się na pierwszym nullznaku, jak poniżej:
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
Bibliografia:
Tak, jeśli zadzwonisz temp.c_str(), zwróci łańcuch c zakończony znakiem null.
Jednak rzeczywiste dane przechowywane w obiekcie tempmogą nie być zakończone znakiem null, ale nie ma to znaczenia i nie powinno mieć znaczenia dla programisty, ponieważ gdy programista tego chce const char*, wywołuje c_str()obiekt, który gwarantuje zwrócenie wartości null -terminated string.
temp.size().
std::stringwewnętrznie liczy liczbę znaków. Wewnętrznie działa przy użyciu tej liczby. Jak powiedzieli inni, kiedy potrzebujesz łańcucha do wyświetlenia lub z jakiegokolwiek powodu, możesz użyć jego c_str()metody, która da ci łańcuch z zakończeniem zerowym na końcu.