* массив символов в строку (два раза запускать код и два разных результата)

Почему один и тот же код имеет два разных результата, не всегда чередуется, но иногда строка, состоящая из массива *, имеет длину: 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~имя

stackoverflow.com/help/репрекс
Michał Walenciak 22.05.2019 15:36

Вероятно, неопределенное поведение. Код, который вы показываете, неполный, поэтому мы не можем воспроизвести и идентифицировать проблему. Пожалуйста, создайте минимальный воспроизводимый пример.

Max Langhof 22.05.2019 15:36

Исчезнет ли индетерминизм, если вместо этого использовать string stringbuffer(buffer, dotpoint - lastdot)? Если это так, строка, на которую указывает lastdot, может не заканчиваться нулевым байтом ИЛИ linequery.copy не добавляет нулевой байт.

Botje 22.05.2019 15:39

Не зная, что такое linequery, сложно сказать наверняка. Но оказывается, что size_t lengthh = linequery.copy(buffer, 4, 0); копирует четыре символа в buffer. Конструктор string, вызываемый в строке string stringbuffer(buffer);, предполагает, что в переданном буфере есть завершающий '\0'. Если его там нет (например, из-за того, что четыре символа были скопированы в buffer, и ни один из них не является '\0'_), то поведение не определено. Вывод length :6 предполагает, что терминатора '\0' нет и что ваш код скопировал 6 символов из четырехсимвольного буфера.

Peter 22.05.2019 15:53

Спасибо, теперь понял

Jakinto 22.05.2019 16:09
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
5
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, linequery.copy не записывает завершающий нуль, поэтому вы полагаетесь на то, что следующий символ после buffer будет NULL, что не гарантируется. Вы должны построить строку с:

string stringbuffer(buffer, dotpoint-lastdot);

«что не гарантируется», на самом деле гарантировано неопределенное поведение

Slava 22.05.2019 15:53

Да работает отлично. Но почему иногда раньше, несмотря на то, что массив *char был определен [4], строка была длиннее?

Jakinto 22.05.2019 15:53

@Jakinto std::string ctor понятия не имеет, какой размер у буфера. В этой форме он предполагает, что вы передаете ему строку с завершающим нулем, и это приводит к UB, если нет завершения. Если вы знаете длину, используйте другую форму std::string ctor. И ни в том, ни в другом случае это не работает, добро пожаловать в UB.

Slava 22.05.2019 15:56

Спасибо, теперь понял

Jakinto 22.05.2019 16:08

Другие вопросы по теме