Будет ли строка ниже содержать нулевой терминатор '\ 0'?
std::string temp = "hello whats up";
Благодарность! :)
Будет ли строка ниже содержать нулевой терминатор '\ 0'?
std::string temp = "hello whats up";
Благодарность! :)
Ответы:
Нет, но если вы скажете temp.c_str(), что в возврат из этого метода будет включен нулевой терминатор.
Также стоит сказать, что вы можете включать в строку нулевой символ, как и любой другой символ.
string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';
печатает
5 5
и не так, 5 1как вы могли бы ожидать, если бы нулевые символы имели особое значение для строк.
temp.c_str()будет включен нулевой символ. Если он вам действительно нужен в строке, просто добавьте его, как любой другой символ. temp.push_back('\0'). Теперь temp.c_str()будет включать два нулевых символа.
Не в C ++ 03, и до C ++ 11 даже не гарантировалось, что в C ++ std :: string является непрерывным в памяти. Только строки C (массивы символов, предназначенные для хранения строк) имели нулевой терминатор.
В C ++ 11 и более поздних версиях mystring.c_str()эквивалентно mystring.data()эквивалентно &mystring[0]и mystring[mystring.size()]гарантированно будет '\0'.
Это зависит от вашего определения слова «содержать» здесь. В
std::string temp = "hello whats up";
следует отметить несколько моментов:
temp.size()вернет количество символов от первого hдо последнего p(оба включительно)temp.c_str()или temp.data()вернется с nullтерминаторомint(temp[temp.size()])будет нольЯ знаю, я звук , похожий на некоторые из ответов здесь , но я хочу отметить, что sizeиз std::stringв C++это поддерживается отдельно , и это не так, как в , Cгде вы храните подсчет , если вы не найдете первый nullтерминатор.
Чтобы добавить, история была бы немного другой, если бы у вас был string literalвстроенный файл \0. В этом случае построение std::stringостанавливается на первом nullсимволе, а именно:
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
Ссылки:
Да, если вы позвоните temp.c_str(), он вернет c-строку с завершающим нулем.
Однако фактические данные, хранящиеся в объекте, tempне могут быть завершены нулем, но это не имеет значения и не должно иметь значения для программиста, потому что, когда программист захочет const char*, он вызовет c_str()объект, который гарантированно вернет null. -завершенная строка.
temp.size().
std::stringвнутренне ведет подсчет количества символов. Внутренне это работает с использованием этого подсчета. Как говорили другие, когда вам нужна строка для отображения или по какой-либо причине, вы можете использовать ее c_str()метод, который даст вам строку с нулевым терминатором в конце.