Может ли строка 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!!!