Тот факт, что вы установили все символы в std::string
на нулевой терминатор, не делает его empty()
. Он по-прежнему имеет ту же длину, что и раньше, только другой контент. std::string
имеет встроенный механизм для обработки длины строки, поэтому он не должен полагаться на специальные символы, такие как строки C.
Есть несколько выходов, самым простым будет использовать идиому erase-remove и удалить все нулевые символы из строки после l oop:
#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), '\0'), str.end());
//str now doesn't contain any \0 characters
Это решение лучше, потому что вы можете тогда используйте str
правильно - это действительно строка с удалением всех похожих символов.
Вы также можете использовать функции для обработки C -строк, которые останавливаются на первом нулевом терминаторе, поэтому вместо этого из str.empty()
вы проверяете
#include <cstring>
strlen(str.c_str()) == 0
//length of 0 means str has \0 at first place
Недостатком является то, что вы не знаете, все ли символы \0
. Вы только проверяете, является ли первый из них нулевым терминатором.