由于我发现fflush(stdin)
不是一种可移植的方式来处理熟悉的"换行符在输入缓冲区" 中的问题,我一直在使用以下内容当我必须使用scanf
时:
while((c = getchar()) != '\n' && c != EOF);
但今天我偶然发现了我从cplusplus.com on fflush注意到的这一行:
fflush()...在打开更新的文件中(即,打开以进行读取和写入),在执行输入操作之前,应在输出操作之后刷新流。这可以通过重新定位(fseek,fsetpos,倒带)或通过显式调用fflush来完成
事实上,我已经多次阅读过了。所以我想确认一下scanf()
之前我是否可以简单地使用以下任何一项来实现与fflush(stdin)
服务时相同的目的支持:
fseek(stdin,1,SEEK_SET);
rewind(stdin);
PS rewind(stdin)
似乎非常安全且可以刷新缓冲区,我错了吗?
错误如果我们谈论的是fseek(stdin,0,SEEK_SET)
我应该提及stdin
,因为我们无法使用0以外的任何偏移或{{1}返回的偏移量在那种情况下。
答案 0 :(得分:3)
这是唯一可以使用的便携式习语:
while((c = getchar()) != '\n' && c != EOF);
包括this在内的多个主题解释了为什么feesk
通常无效。出于同样的原因,我怀疑rewind
也会起作用,实际上man page说它等同于:
(void) fseek(stream, 0L, SEEK_SET)