私は次のCコードを使用してEOFが発生するまでユーザーからの入力を受け取りますが、このコードは機能していません。最初の入力を受けた後に終了します。誰もこのコードで何が間違っているか教えてもらえますか?前もって感謝します。CでのEOFの検出
答えて
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))
注意、
あなたの例では、scanfの戻り値をチェックし、読み取られたフィールドがないことを示す場合は、ファイルの終わりをチェックしてください。
ありがとうチャールズベイリー。 – itsaboutcode
ブライアンのコメント:stdinは通常、ユーザーが入力できる数が増えているため、通常はEOFを登録しません。 Unixyシステムでは、通常control-Dを意味します。 –
それはあなたが私の「普通」を意味するかによって異なります。 stdin(ファイルまたはパイプ、unixまたはwindows)をリダイレクトした場合、EOFは通常正しく通知されます。対話的なUNIX端末^ Dでは、通常、Windowsテキストモードで動作し、^ Zは行頭で動作します。 –
出発点として、あなたは
while(!feof(stdin))
もう一つの問題だけscanf("%f", &input);
を読んでいるということであると
while(!EOF)
を交換してみてください。ユーザーが "pi"のようにCの浮動小数点数として解釈できないものを入力した場合、scanf()
コールはinput
に何も割り当てず、そこで処理を進めません。これは、「pi」を読み続けることを試み、失敗することを意味します。
while(!feof(stdin))
他のポスターが正しく推薦されている場合、「pi」と入力すると、前の値input
を印刷し、プロンプトを印刷する無限ループが発生しますが、プログラムは新しい入力。
scanf()
は、入力変数への代入数を返します。割り当てを行わなかった場合は、浮動小数点数が見つからなかったことを意味し、入力をさらに入力する場合は、char string[100];scanf("%99s", string);
などで読み込む必要があります。これにより、入力ストリームから次の文字列が削除されます(最大99文字、とにかくchar
は文字列のヌルターミネータ用です)。
あなたが知っている、これは私がscanf()
を憎むすべての理由を私に思い出させている、と私は代わりにfgets()
を使用して、多分sscanf()
を使用してそれを解析する理由。
scanf()の結果を確認して、変換が成功したことを確認する必要があります。そこにいなかった場合、その後の3つのうちの1つは真である:
- のscanf()%F変換指定子(つまり、数字ではない何かのために有効でない文字をのどに詰まらされ、ドット、 'e'、または 'E')。
- scanf()がEOFを検出しました。
- stdinの読み取り時にscanf()がエラーを検出しました。
例:
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);
}
}
while(scanf("%d %d",a,b)!=EOF)
{
//do .....
}
私はこれを使っています.... –
何が間違っている:/私は理解していません –
- 1. CのtxtファイルのEOFを検出
- 2. 基本ファイルC++での処理、EOF検出
- 3. JPGイメージのEOFを検出する
- 4. Logstash Filebeat - EOFの検出方法
- 5. C#でコンソール上のEOFを検出する方法は? EOFでConsole.ReadLine()は何を返しますか?
- 6. C#の - EOF
- 7. 終了EOFが検出されない
- 8. Linux NASMはEOFを検出します
- 9. EOFを検出していない
- 10. JavascriptのJavaソケットを使用したEOF/TCPティアダウンの検出
- 11. CプログラムがEOFチェックでハングアップ
- 12. C - stdin、unix pipeline、EOF
- 13. C/C++でのOSの自動検出
- 14. C#でのエッジ検出
- 15. C/C++でのロバストな顔検出?
- 16. C++のブロブ検出
- 17. C#サウンドカードの検出
- 18. PG :: Error:SSL SYSCALLエラー:EOFが検出されました
- 19. ベクトル、ポインタ、クラス、EoFループ(C++)
- 20. C#のフォーカスコントロールの検出
- 21. Cのロケールセンシティブディジットの検出
- 22. eof(f)をCプログラムのファイル処理
- 23. Linux C!eofイベントの取得方法は?
- 24. Strtokの問題C(EOF文字?)
- 25. C++でのOpenCVのCanny Edge検出
- 26. C#でのクラップ音の検出
- 27. C#.Netでのクローズドフォームの検出
- 28. なぜC言語でEOF IS -1?
- 29. Cで正しくEOFを使用
- 30. Tarjanサイクル検出のヘルプC#
注:IIRCは、通常、そのユーザーが終了するには、Ctrl + Dをヒットしなければならないことを意味するので、ユーザの入力がEOFをチェックし、パイプで連結されていないと仮定すると、おそらく理想的ではありません、それは不明です – Brian