注意
次の解決策に注意してください。あなたのケースのエラーをクリアすることはまだ完了していません。それでも無限ループが発生します。
if (cin.fail())
{
cout << "Please enter an integer";
cin.clear();
}
完全なソリューション
その理由は、ストリームの失敗状態をクリアし、未処理の文字を破棄する必要があるためです。そうしないと、まだ悪い文字が残っており、無限ループが発生します。これを達成するには、単に std::cin.ignore() を実行できます。例えば、
if (cin.fail())
{
cout << "Please enter an integer";
// clear error state
cin.clear();
// discard 'bad' character(s)
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
別の解決策
getline
と を使用しstringstream
て達成することもできます。以下に簡単な例を示します。
string input;
while (1)
{
getline(cin, input);
stringstream(input) >> x;
cout << x << endl;
}