Страницы

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

пятница, 31 января 2020 г.

Очистка буфера ввода cin

#cpp #input


Привет. Есть код.

char friend_sex = 0;

//check if sex is valid
bool ok_sex = false;
//---------------------

while (!ok_sex){

    cout << "Enter the sex of your mutual friend\n";

    // What is sex of that person?
    cout << "M or W: \n";
    //----------------------------

    cin >> friend_sex;

    if(friend_sex == 'M' || friend_sex == 'W'){

        ok_sex = true;

    }

}


Я только учу С++ и хочу сделать обработку неправильного введения пола друга.
К примеру, пользователь вводит что-то кроме W и M и запрос на введение повторяется
в цикле, что видно из кода. Также будет происходить, если пользователь введет много
символов вместо одного. Но тут есть один момент. Дело в том, что так как тип переменной
friend_sex char, то из потока ввода последовательность символов считывается посимвольно.
Я написал abcd, допустим, но считалось сначала a, потом (если это в цикле, берется
второй символ и происходит проверка, и так до конца). По сути, если написать abcMf,
то на проверке четвертого символа цикл завершится, ибо проверка будет пройдена.Вопрос:
Я хочу, чтобы при введение последовательности символов, считывался первый, а буфер
ввода очищался от оставшихся. Посоветуйте, пожалуйста, функцию очистки буфера (cin.clear()
не работает).
    


Ответы

Ответ 1



Попробуйте cin.clear(); // на случай, если предыдущий ввод завершился с ошибкой cin.ignore(numeric_limits::max(), '\n'); Не забудьте #include #include

Ответ 2



Проще считывать всю строку: std::string friend_sex; do { std::cout << "Enter the sex of your mutual friend\nM or W: \n"; if (!getline(std::cin, friend_sex)) return; // поток ввода закрылся } while (friend_sex != "M" && friend_sex != "W");

Ответ 3



Можно также с помощью директивы #define создать макрос и затем им пользоваться. Например, #define CIN_FLUSH if (std::cin.peek()) std::cin.ignore()

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

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