1

次のコードがどのように説明されるかを誰でも説明できますか?私はそれを本当に理解していません。

while((c = getchar()) != '\n' && c != EOF);

入力ストリームをフラッシュするために使用され、標準の C ライブラリ関数に置き換えることができることを知っています。

fflush(stdin)
4

2 に答える 2

5
while((c = getchar()) != '\n' && c != EOF);

これは、入力文字が行末 (つまり、getchar()returned '\n) またはファイルの終わりまたはエラー状態 (つまり、getchar()returned EOF) に到達するまで読み取ります。

がキーボードから読み取っている場合stdinは、Enter キーを押すまで入力を破棄します。

EOF入力エラーが発生した場合、またはファイルの終わり条件をトリガーした場合 (Unix ではCtrl-D2 回入力することによって) 、チェックをオフにしておくと、無限ループが発生する可能性があります。

これはscanf()、整数を読み取るために使用した後などに役立ちます。を実行scanf("%d", &num);して入力すると、これらの 3 桁が読み取られます (値が に123格納されます) が、その後はすべて読み取られるまで待機します。上記の行を使用して、入力行の残りをスキップできます。123n

(代わりに、おそらくより良い方法は、 を使用して行全体を読み取り、 を使用fgets()してそれらを解析することsscanf()です。)

これは と同等ではありませんfflush(stdin)。C 標準に関する限り、fflush入力ストリームでの呼び出しには未定義の動作があります。

一部の実装では、 の動作が定義されていますfflush(stdin)。たとえば、GNU libc を使用するシステム (ほとんどの Linux システム):

入力ストリームの場合fflush()、基になるファイルからフェッチされたが、アプリケーションによって消費されていないバッファリングされたデータを破棄します。

これは、行末まで入力を破棄することと同じではありません。また、それを使用すると、コードが移植できなくなります。

于 2013-10-06T07:26:44.817 に答える
1

このコードは、ファイル (またはその他の入力) が開かれていると仮定すると、改行 (\n) またはファイルの終わり (eof) が見つかるまで、1 文字ずつ取得し続けます。

fflush は、開いているファイルのストリームをクリアするだけです。

于 2013-10-06T07:25:18.620 に答える