web-dev-qa-db-ja.com

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文字だけが読み取られますが、標準入力の残りの2文字はフラッシュされず、argqで再度読み取られます。どうして?

入力:123 456 789

出力:123 456 89

なぜこれが出力として89になるのですか?

17
Subodh Asthana

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

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

Linux fpurgeのmanページ から:通常、入力バッファーを破棄するのは誤りです。

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

int c;
while ((c = getchar()) != '\n' && c != EOF);
37
jschmier
13
jamesdlin
int c;
while((c = getchar()) != '\n' && c != EOF);

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

11
user1831086

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

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

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

3
dirkgently

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

他は既に洗い流し部分についてコメントしました。

2

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文字列にスペースを入力することもできます。

0
Sunny127