2011-06-08 51 views
4

我有下面的代码,更换fflush的(标准输入)

fflush(stdin); 
print("Enter y/n"); 
scanf("%c",&a); 

这里,在退出之前给input.it看起来像问题,因为它不是冲洗掉,这可能是输入缓冲有一些垃圾字符。是否有任何替代flush(stdin)。此代码片段在Solaris中工作,但它不在Linux中工作。

+2

“man fflush”的第一行显示如下:* fflush()函数对给定的**输出或更新**流**强制**写入所有用户空间缓冲数据。 cnicutar对于如何跳过不需要的输入有正确的答案,但除此之外,您应该*阅读您正在使用的函数的文档。 *和*检查它们的返回值......因为上面的调用将返回'EOF'并设置'errno = EBADF'来表示您错误地使用该函数。忽略返回值是坏的,坏的,坏的... – DevSolar 2011-06-08 10:57:28

+0

参见[使用'fflush(stdin)'](http://stackoverflow.com/questions/2979209/using-fflushstdin)。 – 2016-09-15 05:31:20

回答

14

这在C FAQ中有很好的解释。另见:explanation。建议的解决方案:

  • 使用scanf退出。使用fgetssscanf
  • 使用该吃换行符

    while((c = getchar()) != '\n' && c != EOF) 
    /* discard the character */; 
    

该冲洗标准输入上的一些实现is wrong工作的事实。

某些供应商实现fflush所以 是fflush(标准输入)丢弃未读 人物,虽然移植的程序 不能依靠这一点。

+0

更好的第一个选项。 – 2013-01-13 00:50:21

3

对于C上GNU

可以使用

__fpurge(stdin); 

包括stdio_ext.h头用于访问功能。尽管这篇文章还很旧,但我认为这可能会帮助一些Linux开发人员。

+0

这太可怕了,即使它按预期工作。想象一下,如果输入来自文件或管道,会发生什么情况。 – 2015-01-17 23:51:35

2
scanf(" %c",&c); 

scanf(" "); 
//reading operation (gets(), fgets(stdin,...) etc) 

空间在scanf()的格式串将忽略任何空白,直到第一个非空格。