Будет ли строка ниже содержать нулевой терминатор '\ 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()
метод, который даст вам строку с нулевым терминатором в конце.