Как предотвратить бесконечный цикл, если введено нецелое число?

Я пишу игру для казино на C++ turbo (последняя версия для Windows). Таким образом, в одном конкретном фрагменте программы пользователь должен ввести начальную сумму строго от 0 до 100 000 долларов.

Я создал цикл do-while со встроенным оператором if:

do{
    cout << "\n\nEnter a deposit amount (between $0 and $100000) to play game : $";
    cin >> amount;
    if(amount<=0||amount>=100000)
        cout<<"Please re-enter your amount";
}while(amount<=0||amount>=100000);

Проблема возникает, когда пользователь (то есть я) вводит символ или десятичную дробь; затем программа теряет управление и продолжает бесконечно повторяться.

Вопрос. Как сформулировать оператор if, запрашивающий у пользователя повторный ввод суммы, если введено значение, отличное от целого числа? Как я могу впоследствии предотвратить выход программы из-под контроля?


person Kugelblitz    schedule 03.01.2016    source источник
comment
Я не понимаю другого ответа!   -  person Kugelblitz    schedule 03.01.2016
comment
Что конкретно вам не понятно? Ключевые точки вызывают clear() и используют нечисловой ввод.   -  person πάντα ῥεῖ    schedule 03.01.2016
comment
Итак, в моем случае, как мне использовать нечисловой ввод? В TURBO C++ нет ничего похожего на .fail... Так что я не знаю, что это значит... @πάνταῥεῖ   -  person Kugelblitz    schedule 03.01.2016
comment
Турбо С++ древний, возьмите более современный компилятор.   -  person πάντα ῥεῖ    schedule 03.01.2016
comment
Я знаю, проблема в том, что моя школа требует, чтобы я делал свой проект, используя этот паршивый компилятор :( @πάνταῥεῖ   -  person Kugelblitz    schedule 03.01.2016
comment
Есть много вопросов SO, таких как ваш вопрос, в котором проблема заключается в том, что ошибка и/или оставшаяся часть строки должны быть очищены после того, как пользователь вводит что-то неправильное. Но на данный момент я не помню ни точного синтаксиса, ни ключевых слов для поиска.   -  person JSF    schedule 03.01.2016
comment
@jonskeet Пожалуйста, помогите, о божественный.   -  person Kugelblitz    schedule 03.01.2016
comment
@JSF Жаль .. да:/   -  person Kugelblitz    schedule 03.01.2016
comment
@Kugelblitz Ха, моей школе все равно; пока код компилируется, все в порядке.   -  person Flare Cat    schedule 04.01.2016
comment
^ К счастью, лол... Хотел бы я использовать Haskell :(   -  person Kugelblitz    schedule 05.01.2016


Ответы (3)


Попробуй это

    if(amount<=0||amount>=100000)
    {
        cout<<"Please re-enter your amount";
        cin.clear();
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
person 4386427    schedule 03.01.2016
comment
Фантастический. +1 друг мой... я не понимаю часть cin.ignore... почему там 10000? - person Kugelblitz; 03.01.2016
comment
Нвм... я должен знать. Но спасибо! - person Kugelblitz; 03.01.2016
comment
Примечание: я думаю, что 10000это просто плохая привычка. Наверное, лучше сделать std::numeric_limits<std::streamsize>::max() - person 4386427; 03.01.2016
comment
Да я знаю,,, но это нормально. - person Kugelblitz; 03.01.2016

Проблема в том, что когда вы вызываете cin >> amount и ввод не числовой, данные остаются в буфере. Как только ваш код возвращается к той же операции, ваше чтение снова завершается ошибкой в ​​бесконечном цикле.

Чтобы решить эту проблему, вам нужно проверить результат cin >> amount, например:

if (cin >> amount) {
    ... // do something with amount
} else {
    cin.clear(); // unset failbit
    // Ignore some input before continuing
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

Ссылка на функцию ignore находится здесь.

person Sergey Kalinichenko    schedule 03.01.2016

Вы должны очистить флаг ошибки и игнорировать символы.

Для примера cin.clear() см. здесь.

do {
    cout << "Enter a deposit amount (between $0 and $100000) to play game : $";
    cin >> amount;

    if(amount<=0 || amount>=100000) {
        cout << "\nPlease re-enter your amount\n";
        cin.clear();
        cin.ignore(10000,'\n');
    }
} while(amount<=0 || amount>=100000);
person Danny_ds    schedule 03.01.2016