Почему один и тот же код имеет два разных результата, не всегда чередуется, но иногда строка, состоящая из массива *, имеет длину: 4, а другое время будет длиной: 6. Эти последние 2 символа случайны.
string linequery;
getline(cin, linequery);
char * buffer = new char [4];
size_t lengthh = linequery.copy(buffer, 4, 0);
string stringbuffer(buffer);
cout << " length :" << stringbuffer.length() << endl;
cout << " string buffer : " << stringbuffer << endl;
referencetree.push_back(stringbuffer);
delete [] buffer;
ВЫВОД с длиной 6:
длина :6
строковый буфер: tag1
строковый запрос: тег1.тег2~имя:длина:14
ВЫВОД с правильной длиной 4:
длина :4
строковый буфер: tag1
запрос строки :tag1.tag2~имя : длина :14
ВВОД такой же: tag1.tag2~имя
Вероятно, неопределенное поведение. Код, который вы показываете, неполный, поэтому мы не можем воспроизвести и идентифицировать проблему. Пожалуйста, создайте минимальный воспроизводимый пример.
Исчезнет ли индетерминизм, если вместо этого использовать string stringbuffer(buffer, dotpoint - lastdot)? Если это так, строка, на которую указывает lastdot, может не заканчиваться нулевым байтом ИЛИ linequery.copy не добавляет нулевой байт.
Не зная, что такое linequery, сложно сказать наверняка. Но оказывается, что size_t lengthh = linequery.copy(buffer, 4, 0); копирует четыре символа в buffer. Конструктор string, вызываемый в строке string stringbuffer(buffer);, предполагает, что в переданном буфере есть завершающий '\0'. Если его там нет (например, из-за того, что четыре символа были скопированы в buffer, и ни один из них не является '\0'_), то поведение не определено. Вывод length :6 предполагает, что терминатора '\0' нет и что ваш код скопировал 6 символов из четырехсимвольного буфера.
Спасибо, теперь понял





Вероятно, linequery.copy не записывает завершающий нуль, поэтому вы полагаетесь на то, что следующий символ после buffer будет NULL, что не гарантируется. Вы должны построить строку с:
string stringbuffer(buffer, dotpoint-lastdot);
«что не гарантируется», на самом деле гарантировано неопределенное поведение
Да работает отлично. Но почему иногда раньше, несмотря на то, что массив *char был определен [4], строка была длиннее?
@Jakinto std::string ctor понятия не имеет, какой размер у буфера. В этой форме он предполагает, что вы передаете ему строку с завершающим нулем, и это приводит к UB, если нет завершения. Если вы знаете длину, используйте другую форму std::string ctor. И ни в том, ни в другом случае это не работает, добро пожаловать в UB.
Спасибо, теперь понял