9

Linux GCC で fflush() を使用しましたが、機能しませんでした。その機能に代わるものはありますか?これが私のコードです:

#include<stdio.h>
void main()
{
  char ch='y';
  while(ch=='y')
  {
    int a;
    printf("Enter some value:");
    scanf("%d",&a);
    fflush(stdin);
    printf("Do you want to continue?");
    scanf("%c",&ch)
  }

私が得た出力は次のとおりです。

Enter some value: 10

その後、プログラムは終了します。それで全部です。Linux で何ができますか? 代替機能はありますか?

4

9 に答える 9

19

fflush を使用しないでください。代わりに次の関数を使用してください。

#include <stdio.h>
void clean_stdin(void)
{
    int c;
    do {
        c = getchar();
    } while (c != '\n' && c != EOF);
}

fflush(stdin)実装に依存しますが、この関数は常に機能します。C では、 を使用することは悪い習慣と見なされますfflush(stdin)

于 2013-06-26T11:46:22.613 に答える
5

Linux で常に動作するもの:

#include <termios.h>
#include <unistd.h>

void clean_stdin()
{
        int stdin_copy = dup(STDIN_FILENO);
        /* remove garbage from stdin */
        tcdrain(stdin_copy);
        tcflush(stdin_copy, TCIFLUSH);
        close(stdin_copy);
}

in/out/err fd だけでなく、tcdraintcflushを使用できます。

于 2014-05-27T08:54:20.607 に答える
4

の動作はfflush、入力ストリームに対して定義されていません ( online 2011 standard ):

7.21.5.2fflush関数の

概要

1

    #include <stdio.h>
    int fflush(FILE *stream);
説明

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

3streamがヌル ポインタの場合、fflush関数は、上で動作が定義されているすべてのストリームに対してこのフラッシュ アクションを実行します。

戻り値

4fflush関数はストリームのエラー インジケータを設定し、書き込みエラーが発生した場合は EOF を返し、それ以外の場合は 0 を返します。
于 2013-06-26T12:41:08.210 に答える
2

私は LINUX で作業しているときに同じ問題に直面しました。この問題の別の解決策は、ダミー文字を定義してchar dummy;scanf()実際の入力が行われる直前にそれをスキャンすることです。これは私にとってはうまくいきました。それがあなたにとってもうまくいくことを願っています。

于 2015-06-27T14:15:20.027 に答える
1

fflush()入力ストリームに対してはあまり機能しませんが、scanf()決して返さないため、これは問題ではありません。scanf()を押すまでターミナルウィンドウはCプログラムに何も送信しないため、ブロックされますEnter

次の 2 つのオプションがあります。

  1. タイプ10 Enter
  2. 端末を raw モードにします。

2 番目のオプションには、編集機能が失われるような多くのドローバックがあるため、入力を 1 行ずつ読むことをお勧めします。

于 2013-06-26T11:38:36.867 に答える
1

代わりに __fpurge (何でも) を含めて使用する必要があります。

アルゼンチンからの敬礼

于 2014-04-27T21:59:38.410 に答える
-1

Linux でシステム コールを使用bzero();すると、以前に保存された値をフラッシュできます。terminal と入力して
、 のマニュアル ページをお読みください。この例を試してくださいbzero();man bzero

#include<stdio.h>
#include<string.h>

int main()
{
  char buf[]={'y'};
  int num;
  while(buf[0]=='y')
  {
    printf("enter number");
    scanf("%d",&num);
    printf("square of %d is %d\n",num,num*num);
    bzero(buf, 1);
    printf("want to enter y/n");
    scanf("%s",&buf[0]);
  }
  return 0;
} 
于 2016-06-06T04:58:15.367 に答える