Why do I get an infinite loop if I enter a letter

2019-01-01 13:41发布

This question already has an answer here:

I am writing this code for a homework assignment (just starting C++ so please go easy). We've just started while, do-while, and for loops today. The program runs fine except that if you enter a letter when the program asks for an integer, it loops infinitely. What is going on? (Code below) ***EDIT: To clarify, the part that is looping is: "The number you have entered is negative. Please enter a positive number to continue." But the user is not given a chance to enter another number. It just keeps printing this.

    #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;
}

4条回答
谁念西风独自凉
2楼-- · 2019-01-01 14:11

You can use a "char" datatype as an input from the user then use "static_cast("variable name");

char input;
int choose;
cin >> input;
choose = static_cast<int>(choose) - 48;///then use 'if' statement with the variable 'choose'
查看更多
永恒的永恒
3楼-- · 2019-01-01 14:15

This is how basic_istream works. In your case when cin >> num1 gets wrong input - failbit is set and cin is not cleared. So next time it will be the same wrong input. To handle this correctly you can add check for correct input and clear&ignore cin in case of wrong input. For example:

    #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);
查看更多
长期被迫恋爱
4楼-- · 2019-01-01 14:26

When you enter a letter, the error state of cin is set and there won't be any further input possible before you call cin.clear(). In consequence, the statement cin >> num1 will not change the value of num1 and you loop forever.

Try this:

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

EDIT:

Thanks to Lightness for pointing this out. You should initialize num1 too:

int num1=-1, num2, total;
查看更多
裙下三千臣
5楼-- · 2019-01-01 14:31

This answer should solve your problem. Basically you are trying to read a character from the stream and it can't be parsed to an int, so the stream is left in an error state.

You should check for an error, clear it and react accordingly.

查看更多
登录 后发表回答