最初から、これら2つの関数を呼び出すとバッファをフラッシュすることが明確に書かれているので、なぜ入力バッファfseek(stdin,0,SEEK_SET)
をフラッシュできないのか考えていました(入力または出力に関係なく).しかし、全体のアイデアが新しいように見えたので、私はそれを入れました昨日の不器用な質問。rewind(stdin)
cplusplusreference
fseek(stdin,1,SEEK_SET) または rewind(stdin) を使用して、移植性のない fflush(stdin) の代わりに入力バッファーをフラッシュできますか?
率直に言って、そうしない理由がわかりませんでした.今日私はそれを自分で試してみました. newline lurking in stdin
つまり、複数のステートメントを使用しながら問題を処理するには、非ポータブルおよびUBを使用または代わりにscanf()
使用できるようです。fseek(stdin,0,SEEK_SET)
rewind(stdin)
fflush(stdin)
これがリスクのない正しいアプローチであるかどうか教えてください.今まで、私は次のコードを使用して対処していましたnewline in stdin
: while((c = getchar()) != '\n' && c != EOF);
. 以下は私のコードです:
#include <stdio.h>
int main ()
{
int a,b;
char c;
printf("Enter 2 integers\n");
scanf("%d%d",&a,&b);
printf("Enter a character\n");
//rewind(stdin); //Works if activated
fseek(stdin,0,SEEK_SET); //Works fine
scanf("%c",&c); //This scanf() is skipped without fseek() or rewind()
printf("%d,%d,%c",a,b,c);
}
fseek(stdin,0,SEEK_SET)
私のプログラムでは、またはのどちらも使用しない場合rewind(stdin)
、2 番目はスキップされ、常にscanf()
改行が文字として取り込まれます。またはを使用すると、問題は解決します。fseek(stdin,0,SEEK_SET)
rewind(stdin)