どのように標準入力をフラッシュ ??
次のコードスニペットで機能しないのはなぜですか?
#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になるのですか?
Fflushは出力ストリームでのみ使用されると思います。
Linuxでは fpurge または __ fpurge を試してみてください。 fpurgeは非標準であり、移植性がないことに注意してください。利用できない場合があります。
Linux fpurgeのmanページ から:通常、入力バッファーを破棄するのは誤りです。
Stdinをフラッシュするための最もポータブルなソリューションは、おそらく次のようなものでしょう。
int c;
while ((c = getchar()) != '\n' && c != EOF);
Comp.lang.c FAQから、以下を参照してください。
int c;
while((c = getchar()) != '\n' && c != EOF);
入力バッファをクリアする方法です。
Stdinをフラッシュする方法?
入力ストリームをフラッシュすると、未定義の動作が発生します。試さないでください。
フラッシュできるのは出力ストリームのみです。
arg
の入力の最後の要素を'\0'
でオーバーライドしています。その行は代わりにarg[i]='\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文字列にスペースを入力することもできます。