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

Может ли std::string содержать внедренные нули?

Для обычных строк C нулевой символ '\0' означает конец данных.

Как насчет std::string, могу ли я иметь строку со встроенными нулевыми символами?

4b9b3361

Ответ 1

Да, вы можете иметь встроенные нули в своем std::string.

Пример:

std::string s;
s.push_back('\0');
s.push_back('a');
assert(s.length() == 2);

Примечание: член std::string c_str() всегда будет добавлять нулевой символ в возвращаемый буфер char; Тем не менее, член std::string data() может добавлять или не добавлять нулевой символ в возвращаемый буфер char.

Будьте осторожны с оператором + =

Единственное, на что нужно обратить внимание, - не использовать operator+= с char* в RHS. Он будет складываться только до нулевого символа.

Например:

std::string s = "hello";
s += "\0world";
assert(s.length() == 5);

Правильный способ:

std::string s = "hello";
s += std::string("\0world", 6);
assert(s.length() == 11);

Сохранение двоичных данных, более распространенных для использования std::vector

Как правило, чаще всего используется std::vector для хранения произвольных двоичных данных.

std::vector<char> buf;
buf.resize(1024);
char *p = &buf.front();

Это, вероятно, более распространено, поскольку члены std::string data() и c_str() возвращают константные указатели, поэтому память не модифицируется. с помощью & buf.front() вы можете напрямую изменять содержимое буфера.

Ответ 2

Да. A std::string - это всего лишь vector<char> с преимуществами.

Однако будьте осторожны, чтобы передать такое зверь тому, что вызывает .c_str(), и останавливается на 0.

Ответ 3

Вы можете, но зачем вам это нужно? Внедрение NUL в std::string просто вызывает проблемы, потому что функции, с которыми вы передаете std::string, вполне могут использовать его член c_str(), и большинство из них предположит, что первый NUL указывает конец строки. Следовательно, это не очень хорошая идея. Также обратите внимание, что в UTF-8 только "\ 0" приведет к 0, поэтому даже для целей i18n не существует обоснования для внедрения NUL.

Ответ 4

Да, это действительно.

У вас может быть нулевой символ в середине строки.

Однако, если вы используете std::string с нулевым символом в середине со строкой c вы можете работать в городе undefined, и никто не хочет быть там!!!:

 int n = strlen( strWithNullInMiddle.c_str() ); // Boom!!!