很多C语言初学者在尝试自己写一个比较简单的程序时,都会遇到一个摸不着头脑的问题。那就是 缓冲区残留字符 问题。
我们先来看一个简单的例子:
#include
void main()
{
char a, b;
a = getchar();
b = getchar();
printf("%c %c\n", a, b);
}这个例子的意图十分简单:就是定义两个字符变量并接受其分别从
缓冲区 读取单个字符进行输出。
我们来试试几组输入数据。
1. 输入为 “ A + 回车”
输出为A
2. 输入为 “ A + 空格 + 回车 ”
输出为 A
3. 输入为 “ A + 空格 + B + 回车”
输出为 A
4. 输入为 “ A + B + 回车”
输出为 A + 空格 + B
问题出现了,第一组和第二组输入数据:为什么我输入了第一个字符就直接输出,把第二个字符的输入跳过了?第三组数据明明还有 B 啊,为什么输出却没有?第四组也是,为什么自动就把 B 给读取了?
好吧,现在来解决上述的几个问题。首先,getchar 函数的作用是从 缓冲区 中读入一个字符!无论我们输入多少个字符,getchar只会读取第一个字符。例如输入“ABCD ”,getchar 只会读取字符 A 。而现在!因为 “ ABCD ” 中只有 “A” 被读取了。在缓冲区中,就会残留剩下 “BCD” 三个字符!不但会残留字符,就连空格或换行符等也会被残留在缓冲区中,这就会影响代码编写者想要达到的功能。尤其对于初学者,会使他们十分困惑。
那残留字符会造成什么影响呢?
我们可以从从上面 4 组测试数据 可以看出:
第一组:残留了换行符,换行符被 B吸收掉了。所以导致输入第一个字符就直接输出了。
第二组:残留 “空格 + 换行符" ,而空格被 B 吸收了。
第三组:残留 “ 空格 + B + 换行符 ”。又因 getchar 只会读入一个字符,所以就把 空格 读入了。
第四组:残留换行符,而A 与 B 分别被 a与 b 吸收了。
残留字符的影响,往往会影响下一次的输入操作。所以一般我们需要清空缓冲区或者使用getchar这些函数把换行符读取。要注意的是:getchar是会自动读取的,只要缓冲区有数据存在。