2

何らかの理由で、ユーザーが 'j' や '%' などの間違ったデータ型を入力すると、ループは入力の要求を停止"Enter an integer >"し、何度も表示し続けます。プログラムに不正な入力を処理させるにはどうすればよいですか? また、数値以外の値を入力すると、なぜこのような奇妙な動作が発生するのでしょうか?

#define SENTINEL 0;
int main(void) {
  int sum = 0; /* The sum of numbers already read */
  int current; /* The number just read */

  do {
    printf("\nEnter an integer > ");
    scanf("%d", &current);
    if (current > SENTINEL)
      sum = sum + current;
  } while (current > SENTINEL);
  printf("\nThe sum is %d\n", sum);
}
4

2 に答える 2

3

scanf()一致する入力が見つからない場合、current変数は変更されません: の戻り値を確認してくださいscanf():

/* scanf() returns the number of assignments made.
   In this case, that should be 1. */
if (1 != scanf("%d", &current)) break;

無効な入力の後に引き続き入力を受け入れたい場合は、コメントのpmgstdinで指摘されているように、無効なデータが残るため、そこから読み取る必要があります。考えられる 1 つの方法は、入力を読み取るが代入を実行しない書式指定子を使用することです。"%*s"

if (1 != scanf("%d", &current))
{
    scanf("%*s");
}
else
{
}
于 2012-07-03T15:30:48.177 に答える
1

1 つの方法は、入力を文字列に読み取り、その文字列を必要なデータ型に変換することです。

fgets()私のCは少し錆びていますが、文字列を読み取ってから、sscanf()興味のある変数に文字列を解析/「読み取る」ために使用したことを思い出します.

于 2012-07-03T15:30:55.803 に答える