std::string
хранит свои данные внутренне в виде нуль-терминатором C-строки, но при нормальном использовании не позволяет получить доступ к нулевой терминатор.
Например, если я присвою значение «Hello, World!» в строку, внутренний буфер будет выглядеть следующим образом:
std::string myString("Hello, World!");
// Internal Buffer...
// [ H | e | l | l | o | , | | W | o | r | d | ! | \0 ]
// ^Null terminator.
В этом примере нулевой терминатор НЕ скопирован с конца строки буквальной, но добавлен внутри std::string
.
Как @songyuanyao упоминает в своем ответе, результатом этого является то, что myString[myString.size()];
возвращает '\0'
.
Так почему же std::string
назначить нулевой ограничитель в конце строки? Это, конечно, не должны поддерживать один, потому что вы можете добавить '\0'
в строку и она включена в строку:
std::string myString;
myString.size(); // 0
myString.push_back('\0');
myString.size(); // 1
Причиной такого поведения является поддержка функции std::string::c_str()
. Для возврата const char *
требуется функция c_str()
. Самый эффективный способ сделать это - просто вернуть указатель на внутренний буфер, но для этого внутренний буфер должен содержать символ нулевого терминатора в конце строки. Поскольку C++ 11, строки требуется, чтобы включить нулевой ограничитель для поддержки этого.
P.S. Хотя это и не часть вашего вопроса, то следует отметить, что цикл из вашего вопроса может не возвращать полную строку, если строка содержит нулевые символы:
std::string S("Hey");
S.push_back('\0');
S.append("Jude");
for(int i = 0; S[i] != '\0'; ++i)
std::cout << S[i];
// Only "Hey" is printed!
'станд :: string' не пахнет, как C. –
Проверьте это: http: // stackoverflow.com/questions/39725183/difference-between-string-empty-and-string0-0/39725242 –
Я снова открыл вопрос, потому что OP знал о 'std :: string', не имеет нулевого конца, но путается о поведении' std :: строка :: оператор [] '. – songyuanyao