我正在编写一个函数,我只需要获取一个数字,我决定使用getchar()而不是scanf()。
然而,由于我只需要一个字符,所以我没有使用数组来获取它。这会导致问题,因为我没有循环来找到' / n'字符。为了确保在再次使用getchar()之前清除了我的缓冲区,我写了这个:
while (getchar() != '\n'){}
它按照我需要的方式工作,但这是"正确的"怎么回事呢?
我尝试使用fflush(stdin),但似乎没有任何效果。
感谢所有回复,我经常查看评论,并希望回答问题。
答案 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()
。