При попытке ввода числа в переменную из - за ошибки в сравнении на положительное число программа перестает реагировать

#include <iostream>
#include <string>

using namespace std;

int main() {
setlocale(LC_ALL, "RU");
int a;
cout << "Введите положительной число\n";
cin >> a;
if (a <= 0) {
    
        cout << "Ошибка, введите еще раз\n";
        cin >> a;
    
    while (a <= 0);
}
else if (cin.fail()) {
    
        
        cout << "Ошибка введите еще раз\n";
        cin >> a;
        
     while (a <= 0);
}
else {
    cout << a;
}

}


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

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

Goop_gooprn, прав. Цитата:

А каким образом заставить прекращать цикл, вводя требуемое число?

Поднял while над cin и cout, но при if(cin.fail()) выдаётся как раз таки бесконечное предложение ввести ещё раз, а ввод не начинается.

Я думаю, всю вашу конструкцию с условиями, начиная с cin>>a и до конца, можно заменить на:

while(cin >> a)
{
    if(a <= 0)
    {
        cout << "Ошибка введите ещё раз\n";
    }
    else break;
}
→ Ссылка
Автор решения: user7860670

Стоит избавиться от копипасты и начать корректно обрабатывать флаги состояния потока, не забывая вычитывать оставшиеся мусорные символы в случае fail.

#include <iostream>
#include <string>
#include <cassert>

int main()
{
    ::std::cout << "Введите положительной число" << ::std::endl;
    int a{};
    for (;;)
    {
        if (::std::cin >> a)
        {
            if (0 < a)
            {
                break;
            }
        }
        else
        {
            if (::std::cin.eof() or ::std::cin.bad())
            {
                // получить дальнейший ввод нельзя
                a = 42;
                break;
            }
            assert(::std::cin.fail());
            ::std::cin.clear();
            // вычитываем до конца строку с невалидным числом
            ::std::string garbage{};
            ::std::cin >> garbage;    
        }
        ::std::cout << "Ошибка, введите ещё раз" << ::std::endl;
        continue;
    }
    ::std::cout << "ok " << a << ::std::endl;
    return 0;
}

online compiler

→ Ссылка
Автор решения: dahoonpao

Самый простой вариант:

#include <iostream>
#include <string>

using namespace std;

int a;

int main() {

    setlocale(LC_ALL, "RU");


    while (a <= 0)
    {
        cout << "Введите положительной число\n";
        cin >> a;
    }
}
→ Ссылка