cin не работет при повторном обращении

Есть функция, считывающая ввод пользователя

int i{ 0 };
do
{
    std::cin.clear();
    std::cout << "How many numbers do you want?\n";
    std::cin >> i;
    std::cin.ignore();

    if (std::cin.fail() or i < 0)
    {
        std::cout << "Incorrect input. Please try again\n";
        std::cin.sync();
    };

} while (std::cin.fail());

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


Ответы (1 шт):

Автор решения: Harry

Ну, если состояние fail, то ignore просто не будет работать.
Потом, если бы и работал - то вы же попросили игнорировать один символ. Но все равно, пока не будет вызван clear - все операции будут просто игнорироваться.

Вам надо примерно такое:

int i;
for (;;) {
    std::cout << "How many numbers do you want?\n";
    if ((std::cin >> N).good() && (i >= 0)) break;
    if (std::cin.fail())
    {
        std::cout << "Incorrect input. Please try again\n"
        std::cin.clear();
    } else {
        std::cout << "Incorrect input - i < 0. Please try again\n";
    }
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
}
→ Ссылка