Как проверить действительный ввод пользователя? - PullRequest
0 голосов
/ 17 апреля 2020

Я делал проект для онлайн-курса, и последний проект заключался в создании программы Build Your Adventure, в которой у пользователя есть выбор, и он ведет к окончанию. Я удалил огромное вступление и только что скопировал ту часть, где у меня есть первый выбор. В общем, все работает, когда я не пишу правильные числа, но когда я пишу в письме ... вся программа начинается с бесконечного l oop. Пожалуйста помоги! Вот код:

#include <iostream>

int main() {

    int c1;

    std::cout << "After what felt like thirty minutes of "
                 "walking you reached a wall. Yes, a wall.\n"
                 "A wall so tall and wide you couldn't imagine "
                 "climbing over it or walking around it.\n";
    std::cout << "Luckly, you see two animals willing to help you.\n"
                 "1) A mole that can build a tunnel under the wall\n"
                 "2) An eagle that can carry you over the wall\n";
    std::cout << "Enter 1 or 2 to make a choice: ";
    std::cin >> c1;

    while (!(std::cin >> c1) || c) {
        std::cout << "Error! Please enter a valid input!\n";
        std::cout << "Enter 1 or 2 to make a choice: ";
        std::cin >> c1;
        std::cout << "\n"
    }

1 Ответ

0 голосов
/ 17 апреля 2020

Когда вы вводите недопустимые входные данные для int, поток переходит в состояние сбоя и не может читать дальнейшие входные данные. Поэтому вы должны очистить состояние ошибки потока и игнорировать все, что осталось во входном потоке.

#include <iostream>
#include <limits>

int main() {

    int c1;

    while (true)
    {
        std::cout << "Enter 1 or 2 to make a choice: ";

        if ((std::cin >> c1) && (c1 == 1 || c1 == 2)) break;
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cout << "Error! Please enter a valid input!\n";
    }

    // Now c1 is either 1 or 2 
}
...