web-dev-qa-db-ja.com

数字ではなく文字を入力すると無限ループになるのはなぜですか?

私は宿題のためにこのコードを書いています(C++を始めたばかりなので、簡単に進んでください)。今日、while、do-while、forループを開始しました。プログラムが整数を要求するときに文字を入力すると、無限にループすることを除いて、プログラムは正常に実行されます。何が起こっている? (以下のコード)***編集:明確にするために、ループしている部分は次のとおりです:「入力した数値は負です。続行するには正の数値を入力してください。」ただし、ユーザーは別の番号を入力する機会が与えられません。これを印刷し続けるだけです。

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

こうやって 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

この答え は問題を解決するはずです。基本的に、ストリームから文字を読み込もうとしていて、それをintに解析できないため、ストリームはエラー状態のままになります。

エラーをチェックし、それをクリアして、それに応じて対応する必要があります。

1
ghembo

文字を入力すると、cinのエラー状態が設定され、cin.clear()を呼び出す前にそれ以上の入力はできなくなります。その結果、ステートメントcin >> num1num1の値を変更せず、永久にループします。

これを試して:

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

編集:

これを指摘してくれたLightnessに感謝します。 num1も初期化する必要があります。

int num1=-1, num2, total;
1
Axel

ユーザーからの入力として「char」データ型を使用してから、「static_cast( "変数名");を使用できます。

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