使用Getchar时清除缓冲区(必须有更好的方法!)

时间:2017-05-13 14:14:00

标签: c char getchar fflush

我正在编写一个函数,我只需要获取一个数字,我决定使用getchar()而不是scanf()。

然而,由于我只需要一个字符,所以我没有使用数组来获取它。这会导致问题,因为我没有循环来找到' / n'字符。为了确保在再次使用getchar()之前清除了我的缓冲区,我写了这个:

while (getchar() != '\n'){}

它按照我需要的方式工作,但这是"正确的"怎么回事呢?

我尝试使用fflush(stdin),但似乎没有任何效果。

感谢所有回复,我经常查看评论,并希望回答问题。

1 个答案:

答案 0 :(得分:3)

请注意,根据C标准,fflush(stdin)是未定义的行为,但有一些实现支持它。

这样做的惯用方法是:

int c;
while ((c = getchar()) != '\n' && c != EOF) {
    continue;
}

如果EOF中出现错误,或者用户从键盘发出getchar()信号,则需要检查EOF以避免无限循环。变量c必须是int,以确保它可以保存EOF的值,通常为-1。

另请注意,此方法要求输入流中至少有一个字符,否则getchar()将阻塞,等待输入。之前对getchar()scanf()的调用至少会留下换行符,但可能不会调用fgets()