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