Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Некорректное чтение строки из std::cin после чтения числового значения

#cpp #ввод


При считывании потока из командной строки в переменную с помощью std::getline не
дает ввести данные, перескакивает. Как можно считать строку с пробелами в переменную
избежав моей проблемы в std::getline   

std::string  fio;
std::string  citi;
int id;

std::cout << "Введите id(число) абонента: ";
std::cin >> id;

std::cout << "Введите ФИО абонента: ";
std::getline(std::cin, fio, '\n');

std::cout <<"Введите город абонента: ";
std::cin >> citi;


ВЫВОД:
добавление абонента в группу пользователей

Введите id(число) абонента: 12
Введите ФИО абонента: Введите город абонента:

    


Ответы

Ответ 1



Вставьте строку #include //... std::cout << "Введите id(число) абонента: "; std::cin >> id; std::cin.ignore( std::numeric_limits::max(), '\n' ); std::cout << "Введите ФИО абонента: "; std::getline(std::cin, fio, '\n'); Проблема заключается в том, что в буфере ввода после использования оператора operator >> остается символ новой строки, соответствующий нажатой клавише Enter. А функция std;:getline читает буфер, пока не встретится этот символ. Поэтому если его не удалить, то будет считана пустая строка.

Ответ 2



Потому что после ввода числа в буфере остается символ '\n'. Он и считывается при вводе строки как пустая строка. Вам надо сбросить содержимое буфера перед вводом строки: cin.ignore(std::numeric_limits::max(), '\n'); При неверном вводе числа нужно еще сбросить флаг состояния ошибки cin.clear().

Ответ 3



(std::cin >> id).get(); Нужно проигнорировать символ переноса строки, потому что он остается и тогда getline читает пока не встретит этот символ и в итоге считывается пустая строка.

Комментариев нет:

Отправить комментарий