Первое, что нужно отметить, это то, что std::string
не имеет конструктора, который может вывести длину строкового литерала из базового массива. Он имеет конструктор, который принимает const char*
и рассматривает его как строку с нулевым завершением. При этом он копирует символы, пока не найдет первый \0
.
Это конструктор, используемый в string m = "0100700\0";
, поэтому в первом случае ваша строка имеет длину 7. Обратите внимание, что нет другого способа получить длину массива символов из указателя на его первый элемент.
Во втором примере вы добавляете символ к существующему объекту std::string
длиной 7. Это увеличивает длину до 8. Если вы должны были перебирать элементы строки, вы могли бы увидеть, что этот 8-й элемент равен '\0'
.
for (auto c: n)
if (c == 0) std::cout << "null terminator" << std::endl;
Для того, чтобы инициализировать строку, содержащую '\0'
символов, у вас есть варианты:
использовать список инициализации:
std::string s{'a', 'b', '\0', 'd', 'e', '\0', 'g'};
конструкта из другого контейнера или массива с помощью std::string
«s итераторой конструктора :
std::vector<char> v{'a', 'b', '\0', 'd', 'e', '\0', 'g'};
char c[] = {'a', 'b', '\0', 'd', 'e', '\0', 'g'};
const char* ps = "ab\0de\0g";
std::string s0(std::begin(v), std::end(v));
std::string s1(std::begin(c), std::end(c));
std::string s2(ps, ps + 8);
Вам не нужен явный нулевой символ, поскольку он уже существует –
Прошу прощения за дублированный вопрос. Отныне я пытаюсь решить свой вопрос, ища более внимательно. – carrot031