6

fflush(..)が機能しないのはなぜですか? 宣言を使用しても機能するが機能しない場合、別の場所に配置しようとしましたが、機能しませんでした.ubuntu 13.04でコードブロックを使用しています;c2c0
c0 = 0c2 = 0fflush(stdin)

int main(void)
{
    int cod ,passou = 0, c0, c1, c2, c3, ct;
    float p1, p2, p3;
    char o;

    do {
    puts  ("Informe codigo: ");
    scanf ("%i", &cod);
    fflush (stdin);
        switch (cod)
        {
            case 0:
                c0 = c0 + 1;
                break;

            case 1:
                c1 = c1 + 1;
                ct = ct + 1;
                break;

            case 2:
                c2 = c2 + 1;
                ct = ct + 1;
                break;

            case 3:
                c3 = c3 + 1;
                ct = ct + 1;
                break;

            default:
                puts ("Valor invalido");

        }
        getchar();
        puts ("Deseja informar mais um voto?");
        fflush (stdin);
        scanf("%c",&o);
        if (o == 'S' || o == 's' ) {
        passou = 0;
        } else if (o == 'N' || o == 'n' ) {
        passou = 1;
        } else {
        puts ("Opcao invalida");
        }
        } while ( passou != 1 );


        p1=(c1/ct)*100;
        p2=(c2/ct)*100;
        p3=(c3/ct)*100;
        if (c1 > c2 && c1 > c3 && c1 > c0 ) {
        puts ("Candidato numero 1 eh o vencedor");
        } else if (c2 > c1 && c2 > c3 && c3 > c0) {
        puts ("Candidato numero 2 eh o vencedor");
        } else if (c3 > c1 && c3 > c2 && c3 > c0) {
        puts ("Candidato numero 3 eh o vencedor");
        } else {
        puts ("Numero de votos em branco eh maior do que todos os outros candidatos");
        }
        printf ("\nTotal de votos do candidato 1: %d", c1);
        printf ("\nTotal de votos do candidato 2: %d", c2);
        printf ("\nTotal de votos do candidato 3: %d", c3);
        printf ("\nTotal de votos em branco: %d", c0);
        printf ("\nPercentual de votos do candidato 1: %.2f", p1);
        printf ("\nPercentual de votos do candidato 2: %.2f", p2);
        printf ("\nPercentual de votos do candidato 3: %.2f", p3);

        return 1;
    }
4

2 に答える 2

4

お使いのシステムでは、ubuntu 13.04 (Unix または Linux) の呼び出し fflush (stdin);は未定義の動作です!

int fflush(FILE *ostream);

ostream が、最新の操作が入力されていない出力ストリームまたは更新ストリームを指している場合、fflush 関数により、そのストリームの未書き込みデータがホスト環境に配信され、ファイルに書き込まれます。それ以外の場合、動作は未定義です

入力バッファーを正しくフラッシュするコツを学ぶには、入力バッファーから不要な文字を実際に読み取って破棄する次のコード スニペットのいくつかを使用できます。実際のデータを読み取る前に、これを fflush として使用できます。この FAQ エントリをお読みください。

Cの場合:

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

C++の場合:

 while ((ch = cin.get()) != '\n' && ch != EOF);

ただし、入力ストリームにデータがないときにこれらを呼び出すと、プログラムはデータが存在するまで待機するため、望ましくない結果が生じます。

読む: @ Keith Thompsonの回答: 「C ライブラリ関数の代替fflush(stdin)

編集:
が完全に定義されているプラ​​ットフォームがありますfflush(stdin)(そのプラットフォームの非標準拡張機能として)。主な例は、まとめて Windows として知られるよく知られたシステム ファミリです。マイクロソフトの仕様:

ストリームをフラッシュします

関数はint fflush(FILE *stream )ストリームをフラッシュします。ストリームに関連付けられたファイルが出力用に開かれている場合、ストリームにfflush関連付けられたバッファーの内容をそのファイルに書き込みます。ストリームが に対して開いている場合 、バッファの内容をクリアしますinputfflush fflushストリームに対する ungetc への以前の呼び出しの効果を無効にします。また、fflush(NULL) 出力用に開いているすべてのストリームをフラッシュします。通話後、ストリームは開いたままです。fflush は、バッファリングされていないストリームには影響しません。

于 2013-05-25T18:40:40.757 に答える
2

fflush(stdin)には未定義の動作があります。特に文字を読み取る必要があるが、バッファに残っている改行が自動的に文字として取り上げられる場合に、stdin使用中にバッファに残っている改行を処理するためにこれを使用します。scanf()

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

これがその内容cplusplusreferenceですfflush()(他の情報源からも同じことを確認できます。なぜなら、ここSOのあまりにも多くの退役軍人が眉をひそめてcplusplusreferenceいるからです。彼らはそれを完全に非難することはできませんが)

......In some implementations, flushing a stream open for reading causes its input buffer to be cleared (but this is not portable expected behavior).....

http://www.cplusplus.com/reference/cstdio/fflush/

于 2013-05-25T18:43:22.107 に答える