Подтвердить что ты не робот

Почему я получаю бесконечный цикл, если я ввожу букву, а не число?

Я пишу этот код для домашнего задания (только начинаю С++, поэтому, пожалуйста, пройдите). Мы только что начали, пока-то, и для циклов сегодня. Программа работает отлично, за исключением того, что если вы вводите букву, когда программа запрашивает целое число, она бесконечно циклически. Что происходит? (Код ниже) *** РЕДАКТИРОВАТЬ: Чтобы уточнить, часть, которая является петлей: "Номер, который вы ввели, отрицательный. Пожалуйста, введите положительное число для продолжения". Но пользователю не предоставляется возможность ввести другой номер. Он просто печатает это.

    #include <iostream>
using namespace std;

int main ( )
{
    //define variables
    int num1, num2, total;
    char answer1;

    do
    {
        //user enters a number
        cout << "\nPlease enter a positive number and press Enter: \n";
        cin >> num1;

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

        cout << endl;

        //add the sum of 1 through num1 value
        num2 = 1;
        total = 0;
        while (num1 >= num2)
        {
            total = total + num2;
            num2 ++;
        }

        //tell the user the sum
        cout << "The total of all the integers\nfrom 1 to " << num1 << " is: \n";
        cout << total;

        //ask if the user wants to try again
        cout << "\n\nWould you like to try again with a new number?\nEnter y for yes or n for no.\n";
        cin >> answer1;
    } while (answer1 == 'y');   

    cout << endl;
    return 0;
}
4b9b3361

Ответ 1

Вот как работает 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);

Ответ 2

Когда вы вводите букву, устанавливается состояние ошибки 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;

Ответ 3

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

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

Ответ 4

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

char input;
int choose;
cin >> input;
choose = static_cast<int>(choose) - 48;///then use 'if' statement with the variable 'choose'