我从一开始就在想为什么不能刷新输入缓冲区fseek(stdin,0,SEEK_SET)
,rewind(stdin)
因为它清楚地写在cplusplusreference
调用这两个函数刷新缓冲区(输入或输出无关)。但由于整个想法似乎是新的,我把它放进去昨天一个笨拙的问题。
是否可以使用 fseek(stdin,1,SEEK_SET) 或 rewind(stdin) 来刷新输入缓冲区,而不是使用不可移植的 fflush(stdin)?
而且我对我得到的答案持怀疑态度,这似乎表明我做不到。坦率地说,我看不出为什么不这样做。今天我自己尝试了它并且它有效!newline lurking in stdin
我的意思是,为了在使用多个语句时处理问题scanf()
,似乎我可以使用fseek(stdin,0,SEEK_SET)
或rewind(stdin)
代替 non-portable 和UB 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)
or rewind(stdin)
,则跳过第二个scanf()
并始终fseek(stdin,0,SEEK_SET)
使用换行符。如果我使用or ,问题就解决了rewind(stdin)
。