1

私は C++ を学んでおり、このコードの塊は単純な採点プログラムからのものです。しかし、ユーザー入力を取得しようとすると、問題が発生します。数値を入力すると、それが 0 未満か 100 を超えているか、またはその中間であるかに関係なく、私のループは正常に動作します。しかし、任意の文字または英数字以外の文字 (例: +、(、% など) を入力すると、「0 から 100 までの成績値を入力してください」という無限ループが表示され、永遠に出力されます。違う?

ありがとう。

int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;

int grade = -1; // grade will hold grade value; initialized to -1
do {
    cout << "Please enter a grade value between 0 and 100." << "\n";
    cin >> grade;
} while (grade < 0 || grade > 100);

cout << grade << "\n";

printGrade(grade);

return 0;
}
4

4 に答える 4

2

失敗した場合cin>>grade(別名 int として解析できない)、ストリームを消費しません。あなたが試すことができます:

int main()
{ using namespace std;

int grade = -1; // grade will hold grade value; initialized to -1
do {
    cout << "Please enter a grade value between 0 and 100." << "\n";
    if (!(cin >> grade))
    {
      cin.clear();
    }
} while (grade < 0 || grade > 100);

cout << grade << "\n";

return 0;

}

しかし、これは問題の一部にすぎません。本当に、std::getline を使用して、正しい入力のためにグレードを完全な行として解析する必要があります。

于 2013-08-08T19:56:57.497 に答える
1

cin がデータ型 (int) の有効な入力を受信しない場合、変数 grade は変更されず、-1 のままです。入力が成功したかどうかを次のようにテストできます

bool success = (cin >> grade);
if (! success)
{
    cin.clear();
    cout << "bad input\n";
    break;
}

これをショートカットとして使用することもできますif (! (cin >> grade))

再度使用する前にclearエラー状態にする必要があることに注意してください。cin

于 2013-08-08T19:55:21.030 に答える
1

cinが失敗したと確信しているので、失敗フラグなどをリセットする必要があるかもしれません。

これをループに追加します。

if (cin.fail())
{
    cout << "failed";
    cin.clear();
}
于 2013-08-08T19:56:18.730 に答える