29

次のCコードを使用して、EOFが発生するまでユーザーから入力を受け取りますが、このコードが機能せず、最初の入力を受け取った後に終了するという問題があります。誰かがこのコードの何が問題なのか教えてもらえますか?前もって感謝します。

float input;

printf("Input No: ");
scanf("%f", &input);

while(!EOF)
{
    printf("Output: %f", input);
    printf("Input No: ");
    scanf("%f", &input);
}
4

6 に答える 6

49

EOF値 (通常は -1) を持つ単なるマクロです。EOF呼び出しの結果など、に対して何かをテストする必要がありgetchar()ます。

ストリームの終わりをテストする 1 つの方法は、feof関数を使用することです。

if (feof(stdin))

「ストリームの終わり」状態は、読み取りが失敗したにのみ設定されることに注意してください。

あなたの例では、おそらく scanf の戻り値を確認する必要があります。これがフィールドが読み取られなかったことを示している場合は、ファイルの終わりを確認してください。

于 2009-09-15T18:33:49.710 に答える
9

EOFは C の定数です。実際のファイルの EOF をチェックしていません。あなたはこのようなことをする必要があります

while(!feof(stdin))

これがfeofのドキュメントです。scanfの戻り値も確認できます。正常に変換されたアイテムの数、またはEOFファイルの最後に到達したかどうかを返します。

于 2009-09-15T18:34:06.713 に答える
4

別の問題は、あなたが読んでいることscanf("%f", &input);だけです。ユーザーが「pi」のように C の浮動小数点数として解釈できないものを入力すると、scanf()呼び出しは に何も割り当てずinput、そこから先に進みません。これは、「pi」を読み続けようとして失敗することを意味します。

while(!feof(stdin))他の投稿者が正しく推奨している変更を考えると、 「pi」と入力すると、以前の値を出力inputしてプロンプトを出力する無限ループが発生しますが、プログラムは新しい入力を処理しません。

scanf()作成した入力変数への割り当ての数を返します。割り当てが行われなかった場合、それは浮動小数点数が見つからなかったことを意味し、 のようなものでさらに入力を読み取る必要がありますchar string[100];scanf("%99s", string);。これにより、入力ストリームから次の文字列が削除されます (とにかく最大 99 文字 - 余分charは文字列の null ターミネータ用です)。

ご存知のように、これは私が を嫌うすべての理由と、代わりscanf()に を使用fgets()して を使用して解析する理由を思い出させてくれsscanf()ます。

于 2009-09-15T19:21:21.550 に答える
-1

scanf() の結果をチェックして、変換が成功したことを確認します。存在しない場合は、次の 3 つのいずれかが true です。

  1. scanf() は、%f 変換指定子として有効でない文字 (つまり、数字、ドット、'e'、または 'E' ではないもの) で窒息しています。
  2. scanf() が EOF を検出しました。
  3. scanf() が stdin の読み取り中にエラーを検出しました。

例:

int moreData = 1;
...
printf("Input no: ");
fflush(stdout);
/**
 * Loop while moreData is true
 */
while (moreData)
{
  errno = 0;
  int itemsRead = scanf("%f", &input);
  if (itemsRead == 1)
  {
    printf("Output: %f\n", input);
    printf("Input no: ");
    fflush(stdout);
  }
  else
  {
    if (feof(stdin))
    {
      printf("Hit EOF on stdin; exiting\n");
      moreData = 0;
    }
    else if (ferror(stdin))
    {
      /**
       * I *think* scanf() sets errno; if not, replace
       * the line below with a regular printf() and
       * a generic "read error" message.
       */
      perror("error during read");
      moreData = 0;
    }
    else
    {
      printf("Bad character stuck in input stream; clearing to end of line\n");
      while (getchar() != '\n')
        ; /* empty loop */
      printf("Input no: ");
      fflush(stdout);
    }
 }
于 2009-09-15T19:31:34.663 に答える
-1
while(scanf("%d %d",a,b)!=EOF)
{

//do .....
}
于 2015-08-01T07:34:35.150 に答える
-1

出発点として、交換してみることができます

while(!EOF)

while(!feof(stdin))
于 2009-09-15T18:36:45.087 に答える