千家信息网

C语言中的getchar()该怎么使用

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,小编今天带大家了解C语言中的getchar()该怎么使用,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起
千家信息网最后更新 2026年11月01日C语言中的getchar()该怎么使用

小编今天带大家了解C语言中的getchar()该怎么使用,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习"C语言中的getchar()该怎么使用"的知识吧。

前言

近期我在重新学习C语言时候,我发现了一个严重的问题,getchar我居然不会用了....也不是说不会用,我发现了一个非常让我困惑想不明白的问题。可能我在第一次接触C语言时候,就没有把这个概念弄清楚吧,以至于现在会不明白。

getchar困惑的点

我利用getchar函数输入了一串字符ABCD,然后把这串字符给到ch,然后紧接着我打印这个ch,然后我得到了一个字符A,看到这里大家没有感觉有什么问题对吧,当然没有问题,因为getchar只会读一个字符,自然就只读到了A,然后打印时候也自然而然就只打印了这个A出来。

好的我们接着往下看

看到这个我不知道大家有没有想到一个问题,反正我当时就是因为这个问题所困惑很久的。

首先通过第一个例子,我们知道了,getchar是只会读取一个字符

可是这个例子呢,我输入了一串字符ABCDE,按理说他也只是读取到一个字符,那就是这串字符中的第一个字符A,然后读取到了之后把它给了变量ch, 然后来判断这个ch等不等于EOF。

EOF是文件结束标志,在键盘上也就是ctrl+z 大家可以自己打印一下然后对照ASCII码看一下

很显然,当前这个里面根本就没有ctrl+z,所以条件为真,然后执行打印语句。

根据上面我们那段分析,然后应该打印一个字符A对吗,疑惑的事情发生了,它打印了ABCDE!!!是的,完完整整打印出来了。

可能大家经常见到这个类似程序,然后习以为常了,都觉得是应该完完整整打印出来

好的,讲到这里大家是不是就觉得很困惑了,为什么会这样呢?

那我现在就好好给大家讲一下了,原来这里面还涉及到了一个概念

缓冲区

缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。

那么这个和我们的getchar又有什么联系呢?

当然有联系,当我们调用了getchar函数时候,这个函数内部其实是这样做的:

他此时会先从缓存区中读一遍,此时读完之后发现,缓存区中没有数据,他就会等待外部输入,光标此时就会一闪一闪的~

当我们外部输入了字符之后,然后我们就会敲回车结束,这时候我们输入的字符其实就直接全部存在了缓存区中。

假设我此时输入了字符ABCD,然后回车结束,然后此时缓存区中就有了ABCD\n

注意,有意思的事情来了,还有\n ???哈哈哈哈接着往下看

缓冲区带来的问题

大家仔细看一下有没有发现,为什么我getchar没有输入字符呢 ?

其实不是我没有输入字符,只是在我输入完scanf的字符之后,回车结束这个scanf的输入,然后奇怪的事情发生了,程序就直接结束了,是的,跳过了getchar输入字符这个过程。

大家有没有觉得奇怪?

这就是我刚才上面给大家提到的 \n

是这样的,当我此时调用了scanf函数之后,我外部输入了 ABCD,然后输入完ABCD之后呢我要结束输入,然后我们就会去敲回车,注意!!这个回车其实也是一个字符,然后他也会连同我前面输入的ABCD一起放到缓存区,也就是说此时缓存区中就有了ABCD\n

我们做一个小小的测试就知道了

看到这个打印的结果,大家明白了吧

getchar工作原理

原来调用getchar函数的时候,它其实是直接从缓存区中读,如果缓存区中有数据,他就会直接拿走第一个,然后他的使命也就结束了。其实这里呢就是上面scanf在缓存区中拿走了ABCD,然后还剩下一个 10,这个10其实是\n ,是它在ASCII码中的表示。于是这个剩下的\n就在缓存区中存下去了,然后他此时遇到了getchar函数,然后getchar在缓存区中读,发现:诶,还剩一个\n,那么我就直接拿走,然后他的使命也就便结束了,所以就出现了不会等待我们外部输入的那种情况了。

那么我们可以解决这个问题吗?

解决缓冲区带来的问题之清空缓存区

明白了缓冲区和getchar的联系之后,其实我们想解决就很好办了

我们只需要在getchar读取之前在插入一个getchar函数,也就是说让他在下一次真正getchar读取之前,我们先再用一个getchar函数读一下那个缓存区剩下的\n,这样下一次我们真正的getchar读取时候,缓存区就空了。

好了getchar的工作原理我们彻底明白了,那么我们在回到最初的那个疑惑上面。

解决最初的困惑

第一次循环:首先缓存区为空,光标闪烁,然后等待我的输入

我输入了一个字符A,然后我继续输入了回车结束,那么我此时其实输入了两个字符,一个字符A,一个字符 \n,此时他们都被存放在了缓存区。然后缓存区有了数据之后,光标此时不在闪烁,getchar函数便开始直接读取,然后在这一次循环中,getchar函数读取到了一个字符A,然后将它给到ch,然后条件表达式为真(不等于ctrl+z),所以执行打印ch,然后打印出了一个字符A。

第二次循环:这时候缓存区还残留了一个\n,光标不闪烁,getchar也不会等待外部输入

那么此时getchar直接读取到这个缓存区中的\n,继续给到ch,然后表达式还是为真,所以继续打印这个ch,此时因为ch已经是被换掉了\n,所以打印换行,光标位置发生改变。

第三次循环:缓存区为空,getchar读取不到数据,光标闪烁,getchar等待外部输入数据。

至此我们在接着往下看

第一次循环:缓存区为空,getchar读取不到缓存区的数据,于是光标闪烁,getchar等待外部输入数据。

此时我输入了一串ABC,然后回车结束输入。此时缓存区中便有了字符ABCD\n,然后getchar读取第一个字符A,然后将它给到ch,然后条件表达式为真,打印了ch,于是第一个A就出来了。

第二次循环:缓存区还剩余BC\n,getchar直接读取

此时getchar读取到字符B,然后给到ch,条件表达式为真,继续打印ch,此时便得到了AB。

第三次循环:缓存区还剩余C\n,getchar直接读取

然后还是一样getchar读取到C,然后给到ch,之后表达式为真,打印出来了ch,然后经过这一次循环就得到了ABC

第四次循环:缓存区还剩余一个\n,最后打印这个\n,于是光标下一行。

最终结果就得到了ABC

然后我再次输入 ctrl+Z

于是缓存区存在了ctrl+z(EOF),然后getchar去读取,然后给到ch,然后表达式判断,条件为假,ch==EOF,所以循环跳出,程序结束。

getchar函数是直接从缓存区中读取数据,如果缓存区中有数据,则直接读取第一个数据,如果没有数据,那么就光标闪烁,等待外部输入数据。

要非常注意的是,我们其他地方输入的回车也会被存在缓存区当成一个字符,然后后面getchar也会将其直接读出,在这个地方很容易出错!

感谢大家的阅读,以上就是"C语言中的getchar()该怎么使用"的全部内容了,学会的朋友赶紧操作起来吧。相信小编一定会给大家带来更优质的文章。谢谢大家对网站的支持!

存区 输入 字符 数据 函数 问题 循环 光标 缓冲 时候 缓冲区 表达式 语言 困惑 就是 条件 也就是 空间 也就是说 事情 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 河南云网互联网络科技有限公司 西安纸贵互联网科技有限公司 互联网科技工作委员会副主任毛军 重生之互联网科技帝国 互联网科技行业发展 互联网巨头反垄断金融科技 华宇互联网科技 礼当家互联网科技 宜安科技 互联网金融 百单互联网科技有限公司 互联网 新科技 重庆科技学院互联网 甘肃拓世互联网科技有限公司 博兴的互联网电子科技公司 剑昆互联网络科技有限公司临桂 厦门比较好的科技互联网公司 企晟互联网信息科技有限公司 科技大学互联网 山东有哪些互联网科技公司 伍佰万互联网科技是干嘛的 迪茉互联网科技 远拓互联网科技 狮子座互联网科技有限公司 互联网金融科技平台 深圳卡尔迅互联网科技有限公司怎么样 互联网科技与管理 岳阳华臻互联网科技有限公司 米聚互联网科技南京有限公司排面 众安科技工业互联网合作 互联网科技包装股份有限公司上市
0