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

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

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

4 ответов


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

пример:

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

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

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

одна вещь, чтобы следить за это не использовать operator+= С char* на RHS. Это только добавит вплоть до нулевого символа.

например:

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

правильно:

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

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

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

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

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


да. Std:: string-это просто vector<char> с пользой.

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


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


Да, это допустимо.

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

однако, если вы используете std:: string с нулевым символом посередине со строкой c функция вашего в неопределенном городе поведения - и никто не хочет быть там!!!:

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