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