Ответ 1
Прежде всего следует отметить, что std::string
не имеет конструктора, который может вывести длину строкового литерала из базового массива. Он имеет конструктор, который принимает const char*
и рассматривает его как строку с нулевым завершением. При этом он копирует символы, пока не найдет первый \0
.
Это конструктор, используемый в string m = "0100700\0";
, поэтому в первом случае ваша строка имеет длину 7. Обратите внимание, что нет другого способа получить длину массива char от указателя до его первого элемент.
Во втором примере вы добавляете символ к ранее существующему объекту 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
:
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);