в то время как цикл зацикливается бесконечно, когда вводится неправильный ввод

Почему следующий цикл выполняется бесконечно, когда вводится неправильный ввод? Как это исправить?

int operation;
    while (true) {
        cout << "What operation would you like to perform? Enter the number corresponding to the operation you would like to perform. ";
        cin >> operation;
        if (operation >= 1 && operation <= 5) break;
        cout << "Please enter a number from 1 to 5, inclusive.\n";
    }

person idealistikz    schedule 06.10.2010    source источник
comment
Это очень похоже на вопрос, который вы недавно задавали. Что случилось с другим вопросом?   -  person Mark Byers    schedule 06.10.2010
comment
Ах, это не тот же человек, который опубликовал это. Это объясняет, почему я не мог найти его!   -  person Mark Byers    schedule 06.10.2010


Ответы (2)


После обнаружения ошибки во входном потоке поток будет находиться в состоянии сбоя. Вы явно должны очистить биты сбоя в этом потоке и затем очистить его. Пытаться:

#include <limits> 
#include <iostream>

...
...
// erroneous input occurs here

std::cin.clear(); 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

Вы можете проверить, вызвал ли ввод ошибку, проверив возвращаемое значение good(), bad(), fail() или eof(). Эти функции просто возвращают состояние внутренних битов состояния (т. е. true, если установлен соответствующий бит — за исключением, очевидно, good(), который вернет true, если все в порядке).

person Jim Brissom    schedule 06.10.2010
comment
это работает, но когда я ввожу правильный ввод, я должен дважды нажать Enter, чтобы получить следующее приглашение. Как мне избежать этого, чтобы мне нужно было войти только один раз? - person idealistikz; 06.10.2010
comment
На это я уже ответил: Проверить, не произошла ли ошибка, и только потом очистить поток. - person Jim Brissom; 06.10.2010

Если у вас есть ввод, который cin не может проанализировать, поток будет в состоянии ошибки.

Вот пример того, как вы можете очистить состояние ошибки, а затем проигнорировать ввод:

int operation;
while (true) {
cout << "What operation would you like to perform? Enter the number corresponding to the operation you would like to perform. ";
        cin >> operation;
        if (cin.fail())
        {
            cout << "Not a number " << endl;
            cout << "Please enter a number from 1 to 5, inclusive.\n";
            cin.clear();
            cin.ignore(100, '\n');
            cin >> operation;
        }
        if (operation >= 1 && operation <= 5) break;
        cout << "Please enter a number from 1 to 5, inclusive.\n";
    }

Обратите внимание, что важно очистить состояние ошибки входного потока, прежде чем пытаться игнорировать неправильные символы. Надеюсь, это поможет--

person davecoulter    schedule 06.10.2010
comment
Когда достигается конец ввода, этот ответ считывается из неинициализированной памяти, а затем переходит в бесконечный цикл. - person Mooing Duck; 25.06.2013