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 1
tak, 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 h
do ostatniego p
(łącznie)temp.c_str()
lub temp.data()
powróci z null
terminatoremint(temp[temp.size()])
będzie wynosić zeroWiem, brzmię podobnie do niektórych odpowiedzi tutaj, ale chcę zwrócić uwagę, że size
of std::string
in C++
jest utrzymywane osobno i nie jest tak, jak w C
przypadku liczenia, dopóki nie znajdziesz pierwszego null
terminatora.
Aby dodać, historia byłaby trochę inna, gdyby string literal
zawierała osadzone \0
. W tym przypadku konstrukcja std::string
zatrzymuje się na pierwszym null
znaku, 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 temp
mogą 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::string
wewnę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.