19

stdinをフラッシュする方法??

次のコードスニペットで機能しないのはなぜですか?

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

int main()
{
        int i=0,j=0, sat;
        char arg[256];
        char * argq;
        argq = malloc(sizeof(char)*10);

        printf("Input the line\n");
        i=read(0, arg, sizeof(char)*9);
        arg[i-1]='\0';
        fflush(stdin);

        i=read(0, argq, sizeof(char)*5);
        argq[i-1]='\0';

        puts(arg);
        puts(argq);

        return 0;
}

ここで、入力を11文字として指定した場合、9文字のみを読み取る必要がありますが、stdinの残りの2文字はフラッシュされず、argqで再度読み取られます。なんで?

入力:123 456 789

出力:123 456 89

なぜこの89を出力として取得するのですか?

4

7 に答える 7

39

fflushは出力ストリームでのみ使用されると思います。

Linuxではfpurgeまたは__fpurgeを試すことができます。fpurgeは非標準であり、移植性がないことに注意してください。利用できない場合があります。

Linux fpurgeのマニュアルページから:通常、入力バッファを破棄したいのは間違いです。

stdinをフラッシュするための最もポータブルなソリューションは、おそらく次のようなものでしょう。

int c;
while ((c = getchar()) != '\n' && c != EOF);
于 2010-02-02T20:37:52.707 に答える
11
int c;
while((c = getchar()) != '\n' && c != EOF);

入力バッファをクリアする方法です。

于 2012-01-27T01:02:56.587 に答える
3

stdinをフラッシュする方法は??

入力ストリームをフラッシュすると、未定義動作が呼び出されます。試さないでください。

フラッシュできるのは出力ストリームのみです。

于 2010-02-02T20:36:13.553 に答える
2

で入力の最後の要素をオーバーライドしていargます'\0'。その行は代わりにあるはずですarg[i]='\0';(エラーと境界チェックの後、あなたは行方不明です)。

他の人はすでにフラッシング部分についてコメントしています。

于 2010-02-02T20:39:46.303 に答える
0

場合によってはコマンドが入力の待機を開始するシナリオにぶつからずに、Linuxでstdinをクリーンアップすることはできません。これを解決する方法は、すべてのstd :: cinをreadLineToStdString()に置き換えることです。

void readLine(char* input , int nMaxLenIncludingTerminatingNull )
{
    fgets(input, nMaxLenIncludingTerminatingNull , stdin);

    int nLen = strlen(input);

    if ( input[nLen-1] == '\n' )
        input[nLen-1] = '\0';
}

std::string readLineToStdString(int nMaxLenIncludingTerminatingNull)
{
    if ( nMaxLenIncludingTerminatingNull <= 0 )
        return "";

    char* input = new char[nMaxLenIncludingTerminatingNull];
    readLine(input , nMaxLenIncludingTerminatingNull );

    string sResult = input;

    delete[] input;
    input = NULL;

    return sResult;
}

これにより、std::cin文字列にスペースを入力することもできます。

于 2017-12-24T12:49:33.457 に答える
-2

Windowsでは、 rewind(stdin)機能を使用できます。

于 2016-06-03T14:06:18.570 に答える