Может станд.:: строка содержит встроенный, аннулирует?

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

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

37
задан Keith Thompson 3 November 2015 в 21:11
поделиться

4 ответа

Да, вы можете встроить нули в свой 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 () вы можете напрямую изменять содержимое буфера.

40
ответ дан 27 November 2019 в 04:56
поделиться

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

0
ответ дан 27 November 2019 в 04:56
поделиться

Да. Std :: string - это просто вектор с преимуществами.

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

7
ответ дан 27 November 2019 в 04:56
поделиться

Ага, это действительно так.

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

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

 int n = strlen( strWithNullInMiddle.c_str() ); // Boom!!!
-3
ответ дан 27 November 2019 в 04:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: