あなたのプログラムは良いものではありませんが、何が起こっているか教えてくれます。
C/C++では、scanf
が入力から整数(%d
)を読み取れない場合は、何も読み取られません。つまり、scanf
がintを読み取ることを妨げていたとしても、そこに残ります。次のscanf
では、同じ文字がエラーの原因になります。
例で説明します。あなたはこの入力から多くの整数を読んでいると想像:あなたは%d
でscanf
を呼び出す場合
12 13 Shahbaz 15
さて、あなたは12
を読み取り、入力は次のようになります。
13 Shahbaz 15
次は、%d
でscanf
を呼び出し、 13
と表示されます。今入力は次のようになります。
Shahbaz 15
ここでも、あなたは%d
でscanf
を呼び出します。ここで、入力はS
(空白の後)で始まり、scanf
は整数を読み取れなかったので失敗して戻ります。入力はそのままです(おそらく空白のために保存されます)。つまり、入力は次のようになります。
Shahbaz 15
あなたが見ることができるように、%d
で入力の読み取りがあなたに正確に同じエラーを与えるだろうし、あなたが無限ループで立ち往生しています。
は、この問題を解決するには、あなたは多くの選択肢を持っています。これは非常にあなたが状況を処理する方法に依存しますが、二つの方法が右printf("Invalid\n")
を印刷した後(%c
付き)文字または(%s
との)文字列を読んでどちらかになります。
第一の方法は次のように入力を処理するための良いです:
q
12 13 q14 15
は無視する必要が間違いです。無効なデータが意味のある言葉ですが、あなたはちょうどそれらを無視したい
12 13 Shahbaz 15
:第二の方法は次のように入力を処理するために良いです。
そして、私はscanf
を使用したい場合の方法は、私はそれを書くと、次のようになります。
int main() // always write int main
{
int nav;
printf("Type an integer: ");
while (scanf("%d", &nav) != 1) // scanf returns number of successful %'s read
{
printf("Invalid number. Try again: ");
scanf("%*s"); // read a %s but ignore it
}
// The rest of the program, using nav
return 0;
}
は再帰的(メインの呼び出しは)少し奇妙です。 – JustJeff
1) 'void main()'はC++では不正です。 2) 'main()'の呼び出しはC++では不正です。 –