2013-08-11 11 views
16

中にfflush(STDIN)の使用は何である私持って次のプログラムCプログラミング

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    char ans[8]; 
    int i; 
    for(i=1;i<=3;i++) 
    { 
     printf("\n What is the unit of traffic ?"); 
     scanf("%s",ans); 
     fflush(stdin); 

     if(stricmp(ans,"Earlang")==0) 
     { 
      printf("\nAnswer is correct"); 
      exit(1); 
     } 
     else 
      if(i<3) 
      printf("\n Try Again!\n"); 
    } 
    printf("\n Nunit of traffic is Earlang:"); 
} 

このプログラムでfflushは(STDIN)の使用は何ですか?

+3

あなたはドキュメントを読むことができませんか? –

+5

@MitchWheatあなたが知っておかなければならないように、多くのドキュメントでは、一部のプラットフォームでのみ動作が定義されているため、fflush(stdin)は言及されません。最初はこれに困惑しているのは当然のことですが([Use fflush(stdin)](http://stackoverflow.com/questions/2979209/using-fflushstdin)など、重複した質問がたくさんあるはずです)。 – Gilles

答えて

10

読み取り前にstdinバッファーをクリアします。男pageから:出力ストリームの場合

、fflushは()すべてのユーザー空間の書き込みは、ストリームの基礎となる 書き込み機能を介して与えられる出力または更新ストリームの データをバッファリング強制します。 入力ストリームの場合、fflush()は、基本ファイルからフェッチされたが、アプリケーションによって消費された ではないバッファされたデータ を破棄します。

注:この入力にfflush()を使用して、Linux特有であるが、ストリームが規格で定義されていない、しかし、ほとんどの実装は、Linuxの場合と同様に振る舞います。

+0

上記のプログラムでは、fflush(stdin)は書き込まれませんが、プログラムは実行されますが、どのようにfflush(stdin)が役立つかを示唆しています。 – user2526830

+0

@ user2526830あなたは何を言っているのかは分かりませんが、読書の前にバッファをクリアしたと言いました。 – iabdalkader

+1

@ user2526830これは、プログラムが常に異なるマシン上で正しく実行され、異なるプロセスを実行し、異なるシステム負荷のもとで実行されることを保証します。 – TheCodeArtist

19

これは標準Cではないため、動作は未定義です。

一部の実装では、stdinバッファをクリアするために使用されます。

C11 7.21.5.2 fflushファンクションfflushは、出力ストリーム/出力ストリームでのみ機能し、入力ストリームでは機能しません。

出力ストリームまたは最新の 操作が入力されなかった更新ストリームへのストリームのポイントは、fflush関数は、そのストリーム のための任意の書き込まれていないデータが発生した場合は、に書き込まれるホスト環境に配信されますファイル;それ以外の場合は、動作は 未定義です。

+8

+1。これは、C標準の観点から見ても間違いありません。いくつかの実装は、入力ストリームを 'fflush()'するセマンティクスを与えますが、これは拡張です。 – glglgl

5

入力バッファからすべてのデータを次の改行まで削除することは不可能です。私はそれがそのような場合に使用さ見てきました :あなたは、文字を入力し、「A」と言うと、ヒットが入力した場合

char c; 
char s[32]; 
puts("Type a char"); 
c=getchar(); 
fflush(stdin); 
puts("Type a string"); 
fgets(s,32,stdin); 

fflush()なしでは、入力バッファは、「\ n」を含んでいます、 getchar()は "a"を覗いているが、 "\ n"はバッファに残っているので、次のfgets()はそれを見つけてユーザーの入力を待たずに空の文字列を返す。

ただし、fflush()のこの使用は不可能であることに注意してください。私は今、Linuxマシンでテストしましたが、それはうまくいきません。

+0

Linuxの場合: #include void clean_stdin(void) { int c; do { c = getchar(); } while(c!= '\ n' && c!= EOF); } https://stackoverflow.com/a/17319153/1925162 – Sunny127