iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中的getchar()使用详解
  • 890
分享到

C语言中的getchar()使用详解

2024-04-02 19:04:59 890人浏览 薄情痞子
摘要

目录前言getchar困惑的点缓冲区缓冲区带来的问题getchar工作原理解决缓冲区带来的问题之清空缓存区解决最初的困惑总结前言 近期我在重新学习C语言时候,我发现了一个严重的问题,

前言

近期我在重新学习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()使用详解的文章就介绍到这了,更多相关C语言getchar()内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言中的getchar()使用详解

本文链接: https://www.lsjlt.com/news/162625.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言中的getchar()使用详解
    目录前言getchar困惑的点缓冲区缓冲区带来的问题getchar工作原理解决缓冲区带来的问题之清空缓存区解决最初的困惑总结前言 近期我在重新学习C语言时候,我发现了一个严重的问题,...
    99+
    2024-04-02
  • C语言中getchar()函数使用详解
    目录一、getchar( ) 函数定义二、函数返回值三、注意区分 getchar 和 scanf四、getchar 的使用实例一、getchar( ) 函数定义 ...
    99+
    2022-12-08
    c语言getchar( ) 函数 getchar( ) 函数 getchar使用
  • C语言中getchar()与putchar()函数详解
    目录getchar()与putchar()getchar()getchar()的一个重要机制getchar()与scanf()区别p...
    99+
    2023-01-08
    C语言 getchar()与putchar()
  • C语言中getchar()怎么用
    小编给大家分享一下C语言中getchar()怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一.getchar()系列1.getcha&#...
    99+
    2023-06-29
  • C语言中的getchar()该怎么使用
    小编今天带大家了解C语言中的getchar()该怎么使用,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“C语言中的getch...
    99+
    2023-06-26
  • C语言的getchar()和putchar()函数怎么用
    这篇文章主要介绍“C语言的getchar()和putchar()函数怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言的getchar()和putcha ...
    99+
    2023-06-16
  • C语言库函数getchar()新见解
    目录getchar()的描述以及用法案例图文解释总结getchar()的描述以及用法 getchar()是stdio.h中的库函数,它的作用是从缓冲区中...
    99+
    2024-04-02
  • C语言中getchar()函数的用法小结
    目录前言:ASCII码1.getchar的作用2.先来看一段代码3.缓冲区4.再来看一个关于getchar()的例子,代码如下5.当输入的数据有空格时前言:ASCII码 A...
    99+
    2022-11-13
    C语言getchar()函数 C语言getchar()函数用法
  • C语言中getchar()的原理以及易错点解析
    目录一.getchar()系列1.getchar()工作原理及作用2.使用getchar()清理回车\n3.使用getchar()清理缓存4....
    99+
    2024-04-02
  • c++中getchar()的用法有哪些
    在C++中,getchar()函数用于从标准输入流中获取一个字符,并返回该字符的ASCII码值。它的用法主要有以下几种:1...
    99+
    2023-08-31
    c++
  • C语言中数组的使用详解
    目录1 数组的基本概念2 数组定义语法3 一维数组的初始化3.1 全部初始化3.2 部分元素赋初值3.3 省略长度赋初值4 一维数组的使用示例4.1 求最大值、最小值、平均值4.2 ...
    99+
    2024-04-02
  • 详解C语言中结构体的使用
    目录结构体的声明结构体成员的类型结构体成员的访问结构体的声明 结构体的定义:结构体是一些值的集合,这些值称为成员变量,结构体的每个成员可以是不同类型的变量。 举例: //定义结构体类...
    99+
    2024-04-02
  • C语言广播的使用详解
    向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息,每个广播消息都包含一个特殊的IP地址,这个IP中子网内主机标志部分的二进制全部为1(也就是网络号是25...
    99+
    2024-04-02
  • C语言中调用汇编语言详解
    目录1.建立新工程2.改写程序3.总结1.建立新工程 首先点击Project里面的 New uVision Project 然后输入文件名,点击保存即可。 在你命名的project中...
    99+
    2024-04-02
  • C语言详解select函数的使用
    目录selectselect API介绍select 代码编译运行select和poll缺点select select API介绍 主旨思想: 首先要构造一个关于文件描述符的列表,将...
    99+
    2024-04-02
  • C语言中static的使用方法实例详解
    目录前言一、static修饰变量1.修饰局部变量2.修饰全局变量二、static修饰函数补充:static的好处是什么?总结前言 static关键字不仅可以用来修饰变量,还可以用来修...
    99+
    2022-11-13
    c语言static的用法 static作用 c语言 c语言static关键字的用法
  • C语言中scanf与scanf_s函数的使用详解
    目录1.scanf_s(是vs提供的函数)2.scanf(标准的库函数)3.总结1.scanf_s(是vs提供的函数) a.代码1 int main() { char a = ...
    99+
    2024-04-02
  • C语言中dlopen和dlsym的使用方式详解
    目录背景demo生产动态库调用dlopen总结背景 为了是不同的逻辑解耦,一般会把各个业务封装成动态库,然后主逻辑去调用各个插件。这里有个问题是,为什么以前我们都是通过include...
    99+
    2024-04-02
  • C语言中scanf函数的使用方法详解
    C语言中scanf函数的使用方法详解及代码示例 C语言是一门广泛应用于各种软件开发的编程语言,其中的输入输出函数在编写程序时起着非常重要的作用。其中,scanf函数是C语言中用于读取标...
    99+
    2024-02-22
    使用方法 输入输出 scanf函数
  • C语言goto语句简单使用详解
    简单介绍 C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。但是某些场合下goto语句还是...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作