C语言之缓冲区残留字符

来源:互联网 发布:java 单元测试 编辑:程序博客网 时间:2024/04/28 05:45

很多C语言初学者在尝试自己写一个比较简单的程序时,都会遇到一个摸不着头脑的问题。那就是 缓冲区残留字符 问题。

我们先来看一个简单的例子:

#include<stdio.h>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 只会读入一个字符,所以就把 空格 读入了。

第四组:残留换行符,而 AB 分别被 a b 吸收了。  

残留字符的影响,往往会影响下一次的输入操作。所以一般我们需要清空缓冲区或者使用getchar这些函数把换行符读取。要注意的是:getchar是会自动读取的,只要缓冲区有数据存在。



原创粉丝点击