Ответ 1
Вы передаете пустую строку. Вместо этого используйте std::string(1, '\0')
.
Или std::string{ '\0' }
(спасибо, @zett42)
У меня есть функция, которая должна кодировать строки, которые должны иметь возможность принимать 0x00 в качестве действительного байта. Моя программа должна проверять длину строки, однако, если я перехожу в "\x00"
в std::string
, метод length()
возвращает 0.
Как я могу получить фактическую длину, даже если строка является единственным нулевым символом?
Вы передаете пустую строку. Вместо этого используйте std::string(1, '\0')
.
Или std::string{ '\0' }
(спасибо, @zett42)
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
.
С С++ 14 вы можете использовать строковый литерал для хранения строк с нулевыми байтами:
using namespace std::string_literals;
std::string a = "\0"s;
std::string aa = "\0\0"s; // two null bytes are supported too