Для обычных струн до, нулевого символа '\0'
показывает конец данных.
Что относительно std::string
, у меня может быть строка со встроенными нулевыми символами?
Да, вы можете встроить нули в свой std :: string
.
Пример:
std::string s;
s.push_back('\0');
s.push_back('a');
assert(s.length() == 2);
Примечание: std :: string
c_str ()
член всегда будет добавлять нулевой символ в возвращаемый буфер символов; Однако элемент std :: string
data ()
может добавлять или не добавлять нулевой символ в возвращаемый буфер символов.
Будьте осторожны с operator + =
Следует остерегаться использования operator + =
с char *
на правой стороне. Он будет складываться только до нулевого символа.
Например:
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 () вы можете напрямую изменять содержимое буфера.
Можно, но зачем вам это нужно? Встраивание NUL в std :: string просто вызывает проблемы, потому что функции, которым вы передаете std :: string, вполне могут использовать его член c_str (), и большинство будет предполагать, что первый NUL указывает на конец строки. Следовательно, это не лучшая идея. Также обратите внимание, что в UTF-8 только '\ 0' приведет к 0, поэтому даже для целей i18n нет оправдания для встраивания NUL.
Да. Std :: string - это просто вектор
с преимуществами.
Однако будьте осторожны, передавая такого зверя во что-то, что вызывает .c_str ()
и останавливается на 0.
Ага, это действительно так.
В середине строки может быть нулевой символ.
Однако, если вы используете std :: string с нулевым символом посередине со строкой ac функция ваш в городе неопределенного поведения - и никто не хочет быть там !!!:
int n = strlen( strWithNullInMiddle.c_str() ); // Boom!!!