No.17 清除scanf()函数的缓冲区

scanf()是C语言中一个重要的输入函数。但是在使用不当时会给程序带来很大的漏洞。在这里,我想就scanf()的缓冲区问题做一简单的论述。

首先,先看以下代码:

#include <stdio.h>

int main()
{
	int count = 0 ;
	char ch = 0 ;
	while(count < 3)
	{
		printf("请输入:") ;
		scanf("%c", &ch) ;
		count++ ;
	}
	return 0 ;
}

运行结果:
No.17 清除scanf()函数的缓冲区

这个运行结果与我的初衷不同。本想通过这个while循环来控制输入三次后结束。可是第二次光标并没有停留,直接跳到了第“三”次输入,这是因为scanf()函数有个缓冲区。在第一次输入A后,还有个回车符 在scanf()函数的缓冲区里,循环到第二次时,直接把这个“回车符”送给了scanf(),所以用户并的输入直接跳到了第三步。或者是一次性输入3个字符甚至更多,程序就会直接执行完毕。道理同上。请看以下运行结果:
No.17 清除scanf()函数的缓冲区
解决这个问题的方法就是要在每次输入后清除掉缓冲区里的剩余内容。请看以下代码:

#include <stdio.h>

int main()
{
	int count = 0 ;
	char ch = 0 ;
	while(count < 3)
	{
		printf("请输入:") ;
		scanf("%c", &ch) ;
		while ((ch = getchar()) != EOF && ch != '\n') ; //清除缓冲区的内容
		count++ ;
	}
	return 0 ;
}

运行结果:
No.17 清除scanf()函数的缓冲区

这样就可以正常地进行输入了。