まず、コードを入力します。このコードの本来の目的は、キーボードからaを入力し、aが正常に読み取られたかどうかを判断し、そうでない場合は情報を出力し、ユーザーが正当な入力を入力するまでユーザーに再度入力させることです。
c ++コード
#include <iostream>
using namespace std;
int main() {
int a=0;
while (1) {
if (!(cin >> a))
{
cout << "I'm in the loop!\n";
}
else
break;
}
cout << a << endl;
return 0;
}
ただし、上記のコードを実行するときに、キーボードで数字の代わりに文字を入力すると、情報の印刷後にユーザーのキーボード入力を再度受け取るのではなく、無限ループに入ります。
この現象の説明は、不正な入力により入力ストリームに状態エラーフラグが設定され、入力された不正な文字が入力ストリームに残るためです。を判断するとき!(cin>>a)
は、最初に入力ストリームのエラーマークが表示され、確立する条件を直接判断し、その情報を出力して、ループに入ります。したがって、2つのことを行う必要があります。
- 入力ストリームのエラーマークをクリアします
これらの2つの手順は、入力ストリームから不正な文字を削除するために不可欠です。したがって、コードをこれに変更できます。
#include <iostream>
using namespace std;
int main() {
int a=0;
while (1) {
if (!(cin >> a))
{
cout << "I'm in the loop!\n";
cin.clear(); // 清除输入流错误标记
cin.ignore(1024,'\n');// 取走刚才输入流中的字符
// cin.ignore()默认取走一个字符
}
else
break;
}
cout << a << endl;
return 0;
}
cコード
#include <cstdio>
int main() {
int a = 0;
while (1) {
if (!scanf("%d",&a))
{
printf("I'm in the loop!\n");
}
else
break;
}
printf("%d\n",a);
return 0;
}
上記のコードは、
ソリューションであるC ++コードと同等です。
#include <cstdio>
int main() {
int a = 0;
while (1) {
if (!scanf("%d",&a))
{
printf("I'm in the loop!\n");
rewind(stdin);
}
else
break;
}
printf("%d\n",a);
return 0;
}