6

由于我发现fflush(stdin)不是一种可移植的方式来处理熟悉的“换行符潜伏在输入缓冲区中”的问题,所以当我不得不使用时,我一直在使用以下方法scanf

while((c = getchar()) != '\n' && c != EOF);

但是今天我偶然发现了我从cplusplus.com 在 fflush 上注意到的这条线:

fflush()...在为更新而打开的文件中(即,为读取和写入而打开),应在执行输入操作之前在输出操作之后刷新流。这可以通过重新定位(fseek、fsetpos、rewind)或显式调用 fflush 来完成

事实上,我之前已经读过很多次了。所以我想确认我是否可以在 之前简单地使用以下任何一个来实现与支持时scanf()相同的目的:fflush(stdin)

fseek(stdin,1,SEEK_SET);
rewind(stdin);

PS rewind(stdin)似乎很安全并且可以刷新缓冲区,我错了吗?

fseek(stdin,0,SEEK_SET)如果我们正在谈论,我应该提到的错误stdin,因为在这种情况下我们不能使用 0 或返回的偏移量以外的任何偏移量ftell()

4

1 回答 1

3

这是唯一可以使用的可移植习惯用法:

while((c = getchar()) != '\n' && c != EOF);

包括这个在内的几个线程解释了为什么feesk通常不起作用。出于同样的原因,我也怀疑rewind它是否会起作用,实际上手册页说它相当于:

(void) fseek(stream, 0L, SEEK_SET)
于 2013-05-21T14:51:12.687 回答