自从我发现
fflush(stdin)
不是处理输入缓冲区中的换行符问题的可移植方式后,每当我必须使用scanf
时,我就会使用以下方法:while((c = getchar()) != '\n' && c != EOF);
但是今天我偶然发现了这一行话,它来自cplusplus.com on fflush:
fflush()...在打开更新文件(即同时打开读写)的情况下,在执行输入操作之前,必须在输出操作后刷新流。可以通过重新定位(fseek、fsetpos、rewind)或显式调用fflush来完成此操作。
事实上,我以前已经多次阅读过这篇文章。所以我想确认是否可以在scanf()
之前使用以下任何一个来达到与支持fflush(stdin)
相同的目的:
fseek(stdin,1,SEEK_SET);
rewind(stdin);
PS rewind(stdin)
看起来很安全可靠,可以清空缓冲区,我错了吗?
错误 如果我们在谈论 stdin
,那么我应该提到 fseek(stdin,0,SEEK_SET)
,因为这种情况下不能使用除0或ftell()
返回的值以外的任何偏移量。
stdin
上执行输出操作,以需要fflush(stdin)
?这似乎很愚蠢!您想要向只读流写入内容?为什么不描述一下您所说的刷新缓冲区是什么,或者您希望fflush(stdin)
做什么?您还可以考虑一下fflush
根据非C++手册实际执行的操作。毕竟,这是C,而不是C++... - autisticstdin
。我的意思是,如果之前的 Enter 键还有一个换行符,那么为什么我们不能使用fseek()
和rewind()
来清除它呢?你是不是想说 stdin 不可寻址?是这样吗? - Jugniscanf("%*[^\n]"); getchar();
如何帮助你读取并丢弃一行的剩余部分? - autistic