<分区>
我从一开始就在想为什么 fseek(stdin,0,SEEK_SET)
和 rewind(stdin)
不能刷新输入缓冲区,因为它写得很清楚在 cplusplusreference
中调用这两个函数刷新缓冲区(输入或输出无关)。但由于整个想法似乎很新,我昨天把它放在一个笨拙的问题中。
我对我得到的答案持怀疑态度,这些答案似乎暗示我做不到。坦率地说,我没有理由不这样做。今天我自己试了一下,它有效!!我的意思是,要在使用多个 scanf()
语句时处理 newline 潜伏在 stdin
上的问题,似乎我可以使用 fseek(stdin,0 ,SEEK_SET)
或 rewind(stdin)
代替不可移植和 UB fflush(stdin)
。
请告诉我这是否是一种没有任何风险的正确方法。到目前为止,我一直在使用以下代码来处理 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)
中的任何一个,则第二个 scanf( )
被跳过,换行符总是 被当作字符。如果我使用 fseek(stdin,0,SEEK_SET)
或 问题就解决了倒带(标准输入)
。