#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()
Комментариев нет:
Отправить комментарий