Подтвердить что ты не робот

Почему std::string ( "\ x00" ) сообщает длину 0?

У меня есть функция, которая должна кодировать строки, которые должны иметь возможность принимать 0x00 в качестве действительного байта. Моя программа должна проверять длину строки, однако, если я перехожу в "\x00" в std::string, метод length() возвращает 0.

Как я могу получить фактическую длину, даже если строка является единственным нулевым символом?

4b9b3361

Ответ 1

Вы передаете пустую строку. Вместо этого используйте std::string(1, '\0').

Или std::string{ '\0' } (спасибо, @zett42)

Ответ 2

std::string отлично умеет хранить нули. Однако вы должны быть осторожны, поскольку const char* нет, и вы очень коротко построите const char*, из которого вы создаете std::string.

std::string a("\x00");

Это создает постоянную строку C, содержащую только нулевой символ, за которым следует нулевой терминатор. Но строки C не знают, как долго они живут; поэтому строка думает, что она работает до первого нулевого терминатора, который является первым символом. Следовательно, создается строка нулевой длины.

std::string b("");
b.push_back('\0');

std::string является нулевым. Символы (\0) также могут быть нулевым байтом. Итак, здесь ничего не мешает нам правильно читать структуру данных. Длина b будет 1.

В общем, вам нужно избегать построения строк C, содержащих нулевые символы. Если вы читаете ввод из файла непосредственно в std::string или не забудьте нажать символы по одному, вы можете получить нужный результат. Если вам действительно нужна постоянная строка с нулевыми символами, подумайте о том, чтобы использовать какой-то другой контрольный символ вместо \0, а затем (если он вам действительно нужен) замените те символы '\0' после загрузки в std::string.

Ответ 3

С С++ 14 вы можете использовать строковый литерал для хранения строк с нулевыми байтами:

using namespace std::string_literals;

std::string a = "\0"s;
std::string aa = "\0\0"s; // two null bytes are supported too