清除输入缓冲区
1、fflush( stdin)
这个可以很好得解决问题,但不是可移植的。
MSDN 文档里清楚地写着fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充),也就是说不是所有的编译器都支持这么用。VC是支持的,如果不用考虑程序的移植性,用fflush(stdin) 也没什么大问题。
2、读字符清空
如果不能用上面的方法,还可以考虑:while(getchar()!='\n');即一直读缓冲区,直到换行为止。这个方法如果用在数字的输入后是很有效的,如果本来希望输入数字,但是不小心在数字后面键入了个字母,这个方法能很好的解决。
但是,若是字符串的输入,则有些棘手。fgets(name,10,stdin); while(getchar()!='\n');这个办法就不能得到好的效果。如果字符串超过了9个字符,则程序只读入前9个字符,后边的字符一直到换行都被getchar()消耗掉,这正合我意,但如果键入的字符串加上回车不到9个字符,则程序会一直等待,直到下一个换行字符,这会影响程序的逻辑。所以,这种方法来处理输入字符串后的缓冲区,是不合适的。
针对这个问题,我们进行改进,改进是基于fgets函数的特性的。
char name[10];
fputs("enter your name\n",stdout);
fgets(name,10,stdin);
if(strlen(name)==9 && name[8]!='\n' )
while(getchar()!='\n');
这样,我所遇到的问题得到解决。在第三行从缓冲区读入最多9个字符,这时有三种情况:
用户输入了7个或以下字符并按回车,这时数组name里的字符串长度小于9,且缓冲区是空的,无需清除;
用户输入了8个字符并按下回车,这时数组name里字符串长度为9,且name[8]为'\n',这时缓冲区也是空的,无需清除;
用户输入了8个以上的字符,并按回车,这时name里的字符串长度为9,缓冲区不空,至少有一个'\n',且以'\n'结尾。
由以上三种情况的分析,就可以得到if(strlen(name)==9 && name[8]!='\n' )这个判断句。