0

無効な戻り値でのscanfの使用について質問があります。これが私がテストしているコードの断片です:

printf("Please enter a number\n");
while (scanf("%d",&number)==0)
{
    printf("Try again.\n");
    scanf("%d",&number);
}

私の推論は、無効な型が使用された場合、2番目のscanfが再度要求し、新しく入力された値をテストする必要があることを示唆しています。ただし、これは当てはまらず、「再試行」メッセージの印刷が停止することはないため、手動で終了する必要があります。なぜこれが起こっているのかわかりません。回避策として考えられることはわかっていますが、可能であれば、whileループの前にscanfを使用する必要はありません。この件について何か助けていただければ幸いです。ありがとう。

4

2 に答える 2

4

scanfエラーコードを返しません。正常に実行された変換の数を返します。

無限ループに関しては、変換できない入力を消費しません。そのため、同じ文字列を数値として繰り返し一致させようとしています。fgets問題のある入力を破棄するために使用してみてください。

于 2013-03-17T00:00:07.740 に答える
1

scanf()EOFは、入力エラーを示すために を返す場合があります。

"scanf 関数は、最初の変換 (ある場合) が完了する前に入力エラーが発生した場合、マクロ EOF の値を返します。それ以外の場合、scanf 関数は、割り当てられた入力項目の数を返します。初期のマッチング失敗の場合はゼロ。" C11 7.21.6.4

scanf("%d", ...after a failed onlyを使用すると、それぞれが非数字、スペースなし、および失敗を消費しようとするためscanf("%d", ...、無限ループが発生します。scanf()問題を回避するには、問題のあるデータを消費する必要があります。

printf("Please enter a number\n");
int number;
int Count;
while ((Count = scanf("%d",&number)) != 1) {
  if (Count < 0) {
    exit(1); // No more input possible
  }
  // Some char is preventing scanf() from reading an int
  scanf("%*c");  // Get it and throw away
  printf("Try again.\n");
}
printf("number = %d\n", number);
于 2013-09-06T22:37:34.597 に答える