C ++: Попробуйте блокировать цикл бесконечного цикла [дубликат]

15
задан user2907563 22 October 2013 в 16:13
поделиться

4 ответа

Вы можете использовать тип данных «char» в качестве ввода от пользователя, а затем использовать «static_cast (« имя переменной »);

char input;
int choose;
cin >> input;
choose = static_cast<int>(choose) - 48;///then use 'if' statement with the variable 'choose'
0
ответ дан Al-Hanash Moataz 17 August 2018 в 09:03
поделиться

Когда вы вводите букву, устанавливается состояние ошибки cin, и до вызова cin.clear() не будет никакого дополнительного ввода. В результате инструкция cin >> num1 не изменит значение num1, и вы навсегда зацикливаетесь.

Попробуйте следующее:

    while (num1 < 0)
    {
        cout << "The number you entered is negative.\nPlease enter a positive number to continue.\n";
        cin.clear();
        cin >> num1;
    }

EDIT:

Благодаря Легкости для указания этого. Вы также должны инициализировать num1:

int num1=-1, num2, total;
1
ответ дан Axel 17 August 2018 в 09:03
поделиться
  • 1
    Этого недостаточно. num1 не инициализируется, поэтому запись в письме не гарантирует запуск этого цикла. – Lightness Races in Orbit 22 October 2013 в 16:01
  • 2
    Похоже, что это действительно было вызвано в примере OP, но, как вы сказали, это не гарантировано. Благодарю. – Axel 22 October 2013 в 16:05
  • 3
  • 4
    Незаконный символ, который вызвал ошибку, не был извлечен, поэтому вы получите это как первое, что произошло в вашем >> после очистки, снова установив ошибку. Вам нужно каким-то образом синхронизировать входные данные. – James Kanze 22 October 2013 в 16:06
  • 5
    @LightnessRacesinOrbit Это то, что изменилось в C ++ 11. Pre C ++ 11, было гарантировано, что сбой >> (для числовых значений) не изменил назначение. В C ++ 11 гарантируется, что он установит значение 0 для ошибки формата и +/- максимальное значение для переполнения. – James Kanze 22 October 2013 в 16:10

Этот ответ должен решить вашу проблему. В основном вы пытаетесь прочитать символ из потока, и он не может быть разобран на int, поэтому поток остается в состоянии ошибки.

Вы должны проверить наличие ошибки, очистить ее и реагировать соответственно. [/ д2]

1
ответ дан Community 17 August 2018 в 09:03
поделиться
  • 1
    Текст "этот ответ & quot; не объясняет, как решить проблему. Я знаю, что это ссылка, но если вы собираетесь ссылаться на какой-то дополнительный ресурс, вы должны процитировать важные отрывки. – Lightness Races in Orbit 22 October 2013 в 16:04

Так работает basic_istream. В вашем случае, когда cin >> num1 получает неправильный ввод - failbit установлен, а cin не очищается. Поэтому в следующий раз это будет тот же самый неправильный ввод. Чтобы справиться с этим правильно, вы можете добавить проверку правильного ввода и очистить & игнорировать cin в случае неправильного ввода. Например:

    #include<limits>

    //user enters a number
    cout << "\nPlease enter a positive number and press Enter: \n";
    do {    
        while(!(cin >> num1)) {
            cout << "Incorrect input. Please try again.\n";
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
        if(num1 < 0) cout << "The number you entered is negative. Please enter a positive number to continue.\n";
    } while(num1 < 0);
13
ответ дан Sergey 17 August 2018 в 09:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: