【C语言】 getchar函数——基础及实践

【什么是getchar函数】

        getchar()函数是C语言中用于读取单个字符的标准输入函数,既然读取单个字符那么他的返回值一定一个char类型的字符吧,但是,他的返回值是一个整形int,那么为什么返回值是一整形呢,这个时候我们就可以想到ASCII码了。我们就可以理解为getchar函数时返回单个字符的ASCII码值。当getchar函数读取不到字符时,他会返回一个EOF。

基础代码案例

接下来我们写一个简单的代码,来展示getchar函数。

在代码运行后我们不管写多少符号,他只会输出第一个字符,这就说明了这个函数时只读取一个字符的。那么我们如果多写几行会怎么样呢?(例如写五行-如下图)

这时,我在键盘上依次打入10个数字,他只会输出1到5,这跟上面一个getchar函数只能读取单个字符原理是是一致的。可是如果我一次不输入5个以上的字符,他会发生一些不一样的反应,例如我只输入三个字符后按回车,他会提示你接着输入,但接着不管输入多少字符,按完回车后他只会输出一个字符,那么这是为什么?

这个时候我就要引入一个概念,那就是缓冲区

【缓冲区】

C语言中我们熟知的一些输入函数,例如scanf、gets这些不是直接从我们的键盘上读取字符和信息的,他们需要一个媒介——缓冲区来实现从键盘上读取字符的。而缓冲区是个什么东西呢,我们从下面的图中可以了解到。

        这张图说明了缓冲区是介于键盘输入与输入函数之间特有的区域,当缓冲区无任何字符时,会提示操作者输入数据,操作者输入字符后,字符会暂存到缓冲区中,而后通过输入函数对缓冲区进行取走并访问。相反,如果缓冲区还有没用过的数据,输入函数会优先取走缓冲区中的数据,当缓冲区没有数据后,才会提示操作者输入新的数据。这样的话我们就可以解释getchar函数的使用方法了。

如果我们对上面的案例进行图解,就会得到下面的图:

        首先我们输入了3个字符并按了回车键,这时我们要明白回车是以[\n]形式储存在缓冲区中的。

        可以看到,第一次输入时,缓冲区中保存了4个字符,第四次取走了 \n 并输出在终端上,这就解释了为什么第一次输入完成后会有两个换行(因为每个printf函数里面也有换行)。那么为什么会二次输入呢?显然是因为现在缓冲区中没有数据了,那么程序会提示你输入一个新的数据保存到缓冲区中,也可以知道第二次输入时不管你是输入多长的字符他最后都只会输出一个字符。

【拓展代码】

        那么接下来我们拓展一下代码,如果我要一直输入字符,当按下回车时结束输入并打印出输入的一系列字符,那么应该怎么写呢?

        当我第一次遇到这个问题时我想到了把getchar函数放到while循环中并写一个跳出条件。然后就出现了下列的代码。

但是当我们运行了这段代码后会发现,虽然实现了一系列的输入,却无法实现把输入的字符全部输出到终端上甚至有时候还会提示你进行第二次输入。这是为什么呢?我们知道getchar函数是一次取走一个字符的,那么我们我们可以把这段代码进行图解。

这个图我们可以理解为while(……)里面的getchar首先取走第一个字符进行判断,然后printf函数里面的getchar取走下一个字符进行输出,以此往复,直到第一个getcahr函数遇到[\n]字符才能结束程序的运行。

这样我们就会有遇到两种情况,第一种是输入的字符个数是偶数,这时输出的系列字符是少一半的,只会输出第二个getchar取走的字符,会正常结束。

如果输入的一系列字符的奇数,首先会输出第二个getchar取走的的字符,输出完以后会提示你二次输入,不会正常的结束程序。

从这里我们可以理解为getchar函数从缓冲区里取走一个字符后他是不会恢复取走的字符的,这就解释了我们为什么只会看到第二个getchar函数里面的字符了。那么我们应该如何进行优化呢?我们可以定义一个char类型的ch暂存getchar去取走的字符并判断,然后输出这个字符即可。如下图。

运行后我们可以看到实现了相应的功能。

【总结】

        这里我们主要讲了getchar函数的基础,他的返回值类型,使用方法和缓冲区。我们可以通俗的理解为getchar函数时访问缓冲区里的单个字符的,会返回单个字符的ASCII值,当读取不到字符或失败时会返回EOF。同时我们也要理解这个函数取走字符后他是不会恢复的,以后我们可以看到很多程序在输入函数后面都会加一个getchar函数来消除缓冲区的里的[\n],这也是他的主要哦用途之一。

        最后谢谢大家观看,有什么不足的地方请在评论区打出来,我会好好改进的!

  • 23
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值