4

fflush(stdin) との使用の違いは何flushstdin()ですか? 私が知っている唯一の違いは、を使用する前にその void を記述する必要があることですが、そのflushstdin()理由はわかりません。

void flushstdin()
{
    int c;
    while((c = getchar()) != '\n' && c != EOF); 
}
int main () {
    float a, b, c;
    float s=0, ar1=0, ar2=0;
    printf("Inform value of side A");
    while(scanf("%f",&a) != 1 || a <= 0){ 
        printf("Invalid value.\n");
        flushstdin();
    }
}

int main(){
    float a,b,c,s=0;
    printf("Inform value of side A.");
    while(scanf("%f",&a) != 1 || a<=0){
        printf("Invalid value.\n");
        fflush(stdin);
    }
}

私は初心者です!どのコードが最適ですか? それとも等しいですか?

4

3 に答える 3

2

それらはかなり異なります。どちらも入力を「フラッシュ」できますが、その言葉の意味が異なります。

fflush標準 C 関数です。などの入力ストリームでの動作stdin未定義です。つまり、C 標準ではその動作が定義されていません。

一部のシステムではfflush、入力ストリームに対する の動作が定義されています。たとえば、Linux では次のようになります。

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

プログラムが Linux ベースのシステムで実行されている場合、または同じ動作が文書化されている別のシステムで実行されている場合fflush(stdin)は、この説明に従って動作することを信頼できます。プログラムの動作は移植できません。他のシステムでは、勝手に悪い振る舞いをする可能性があります。(ほとんどの場合、動作しない場合、エラー表示を返す以外は何もしませんが、それは保証されていません。)fflush(stdin)

独自のflushstdin関数は、 の Linux の動作とは異なることを行いfflush(stdin)ます。最初の改行まで、またはEOF(ファイルの終わりまたはエラーによってトリガーされる)まで、すべての入力関数を読み取って破棄します。その入力がバッファリングされているかどうかに関係なく、これを行います。

たとえば、hello(改行なしで) 文字を入力し、プログラムが を呼び出しfflush(stdin)、改行を入力したします。

fflush(stdin)Linux で文書化された動作を考えると、 を破棄してhelloすぐに戻り、改行は後の呼び出しで読み取られるように残します。stdinそれが何であるかに関係なく、保留中のすべての入力を破棄するという意味で「フラッシュ」します。

flushstdin()関数は を読み取って破棄し、(または)helloを入力するまで待機してから、それを読み取って破棄します。呼び出し時に保留中であったかどうかに関係なく、改行または EOF までのすべての入力を読み取って破棄します。EnterCtrl-D

繰り返しになりますが、 の動作はfflush(stdin)C 標準では定義されていないため、これを使用するとプログラムは移植できなくなります (コンパイラは必ずしもそのことを警告しません)。

ちなみに、「その空っぽのもの」は関数の定義ですflushstdin。これはfflush、すでに定義されている標準 C ライブラリ関数であるため、必要ありません。

于 2015-06-05T20:48:31.090 に答える