Для обычных строк C нулевой символ '\0'
означает конец данных.
Как насчет std::string
, могу ли я иметь строку со встроенными нулевыми символами?
Для обычных строк C нулевой символ '\0'
означает конец данных.
Как насчет std::string
, могу ли я иметь строку со встроенными нулевыми символами?
Да, вы можете иметь встроенные нули в своем 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() вы можете напрямую изменять содержимое буфера.
Да. A std::string - это всего лишь vector<char>
с преимуществами.
Однако будьте осторожны, чтобы передать такое зверь тому, что вызывает .c_str()
, и останавливается на 0.
Вы можете, но зачем вам это нужно? Внедрение NUL в std::string просто вызывает проблемы, потому что функции, с которыми вы передаете std::string, вполне могут использовать его член c_str(), и большинство из них предположит, что первый NUL указывает конец строки. Следовательно, это не очень хорошая идея. Также обратите внимание, что в UTF-8 только "\ 0" приведет к 0, поэтому даже для целей i18n не существует обоснования для внедрения NUL.
Да, это действительно.
У вас может быть нулевой символ в середине строки.
Однако, если вы используете std::string с нулевым символом в середине со строкой c вы можете работать в городе undefined, и никто не хочет быть там!!!:
int n = strlen( strWithNullInMiddle.c_str() ); // Boom!!!