C语言能否使⽤ fflush( ) 函数清除多余的输⼊?
一、问题
在从终端输⼊数据时,很可能会输⼊多余的数据,那么能否使⽤ fflush( ) 函数清除呢?
二、解答
fflush( ) 函数只是⽤在⽂件以写的⽅式打开时,将缓冲区内容写⼊到⽂件。因此 fflush( ) 函数仅对输出流有效,对输⼊流并不能⽤于放弃剩余的输⼊。可通过如下代码了解 fflush( ) 函数是否清除了缓冲区中多余的输⼊。
#include <stdio.h>
int main()
{int integer;char string[81];printf("Enter a sentence of four words with scanf:");for (integer = 0; integer < 4; integer++){scanf("%s", string);printf("%s\n", string);}fflush(stdin);printf("Enter the same sentence with gets:");gets(string);printf("%s\n", string);
}
此例的运⾏结果为:
Enter a sentence of four words with scanf:i am boy !!!!
i
am
a
boy
Enter the same sentence with gets:!!!!
由此可知,fflush( ) 函数在清除缓冲区中的内容时,并没有将缓冲区中多余的数据清除, 使得调⽤ gets( ) 函数获取字符串时获取了多余的数据“!!!!”。
说明:
fflush( ) 函数⾮标准库函数,因此在部分编译环境中可以清除多余的字符,在部分环境中不可以清除多余的字符,例如,在 VC6.0 编译环境中可以清除多余的输⼊字符,但是使⽤ gcc 编译程序时,fflush( ) 函数不可以清除多余的输⼊字符。上述运⾏结果是在 gcc 环境中编译得出的结果。
在gcc 编译环境中,fflush( ) 函数⽆法清除多余的输⼊,那么此时要怎样清除多余的输⼊呢?
若是希望清除掉 scanf( ) 函数之后所剩下的换⾏符和其它的未知输⼊,需要重写 scan( ) 函数,或者使⽤代码语句,屏蔽掉后⾯的字符,例如:
while ((ch = getchar() != '\n' && ch != EOF))/*清除*/;
没有什么标准的⽅法能够清除掉标淮输⼊流中未读取的字符,因为末读取字符也可能来⾃其他的操作系统的输⼊缓冲区。
三、总结
若需要严格丢弃多余输⼊的字符,可以参见使⽤的系统的相关技术。