EOFが発生するまでユーザーからの入力を取得するために次のCコードを使用していますが、問題はこのコードが機能せず、最初の入力を取得した後に終了することです。 。 前もって感謝します。
float input;
printf("Input No: ");
scanf("%f", &input);
while(!EOF)
{
printf("Output: %f", input);
printf("Input No: ");
scanf("%f", &input);
}
EOF
は、値(通常は-1)を持つ単なるマクロです。 getchar()
呼び出しの結果など、EOF
に対して何かをテストする必要があります。
ストリームの終わりをテストする1つの方法は、feof
関数を使用することです。
if (feof(stdin))
「ストリームの終了」状態は、after読み取り失敗のみに設定されることに注意してください。
この例では、おそらくscanfの戻り値を確認する必要があり、これがフィールドが読み取られなかったことを示している場合は、ファイルの終わりを確認します。
別の問題は、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()
を使用して解析する理由を思い出させます。