Подтвердить что ты не робот

Имеет ли std::string нулевой ограничитель?

Будет ли строка ниже содержать нулевой ограничитель '\ 0'?

std::string temp = "hello whats up";

Спасибо!:)

4b9b3361

Ответ 1

Нет, но если вы скажете temp.c_str(), то в результате возврата этого метода будет включен нулевой ограничитель.

Также стоит сказать, что вы можете включить нулевой символ в строку, как и любой другой символ.

string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';

печатает

5 5

а не 5 1, как вы могли бы ожидать, если для строк были использованы специальные символы.

Ответ 2

Не в С++ 03, и он даже не гарантирован до С++ 11, что в С++ std::string непрерывна в памяти. Только C строк (char массивы, предназначенные для хранения строк) имели нулевой ограничитель.

В С++ 11 и более поздних версиях mystring.c_str() эквивалентен mystring.data() эквивалентен &mystring[0], а mystring[mystring.size()] гарантированно '\0'.

Ответ 3

Да, если вы вызываете temp.c_str(), тогда он вернет c-строку с нулевым завершением.

Однако фактические данные, хранящиеся в объекте temp, могут не заканчиваться на нуль, но это не имеет значения и не имеет значения для программиста, потому что когда тогда программист хочет const char*, он будет называть c_str() на объекте, который гарантированно возвращает строку с нулевым завершением.

Ответ 4

С С++-строками вам не нужно беспокоиться об этом и, возможно, зависит от реализации.

Используя temp.c_str(), вы получите представление C строки, которая определенно будет содержать \0 char. Кроме этого, я действительно не вижу, как это было бы полезно для строки С++

Ответ 5

std::string внутренне сохраняет количество символов. Внутри он работает, используя этот счет. Как говорили другие, когда вам нужна строка для отображения или по какой-либо причине, вы можете использовать ее метод c_str(), который даст вам строку с нулевым терминатором в конце.

Ответ 6

Это зависит от вашего определения "содержать" здесь. В

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

Ссылки: