getchar---解析

简介: 知识点—缓冲区缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内冲空间预留了一定的储存空间,这些储存空间用来缓冲输入或者输出的数据,这部分预留的空间就叫做缓冲区。这里一般操作系统上会讲,缓冲区是一块内存区,它在输入输出设备和cpu之间,用来缓存数据。他是低速的输入输出设备和高速的cpu能够协调共工作,避免低速的输入和输出设备占用cpu。

关于getchar基本知识


怎么正确使用getchar


getchar有什么注意点


getcahr分析详解


1.getcahr的功能


  1. 首先它是个字符输入函数,是专门用来获取字符的。
  2. getchar它的参数是什么,返回值又是什么?


059409b4ccf94d7ba49a754cbd7034c7.png


这里表明getchar返回的是一个整形数字,但getchar是用来接收字符的,为什么会返回整形呢?


参数是void,也就是可以不用写。


f96b6a913ada4abd94e9214e96340820.png


getchar库函数所需要引用的头文件就是<stdio.h>


9f84b172f32941c68605deefa2920a1f.png


这些函数中的每一个都返回字符读取。为了指示读取错误或文件结束条件,getc 和 getchar 返回 EOF,getwc 和 getwchar 返回 WEOF。对于 getc 和 getchar,请使用 ferror 或 feof 来检查错误或文件结尾。


2.getcahr的使用


如果要求你一次多组输入,该怎么操作呢?你肯定会想到用循环,循环肯定是必须的,还要注意循环的条件呢。


75ffbfcc21a041659432a7ade9106b80.png


字母大小写转换—例题


要求实现字母的大小写转换。多组输入输出。


e4ed0227a52b4da3ae2f818519ca13d1.png


c1c99fef7b4148bf9d0a77f459bf1bdd.png


正常思路就是大写字母与小写字母之间ASCII码值差32,所以ch+32就是转化后的小写字母。


要求输入换行。


但打印的结果却很奇怪,输入A却打印出来a和 * 输入B却打印出来b和 *,这是为什么呢?


291eb702bb3741e3ad2f819ff65c589f.png


解析:知识点—缓冲区缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内冲空间预留了一定的储存空间,这些储存空间用来缓冲输入或者输出的数据,这部分预留的空间就叫做缓冲区。这里一般操作系统上会讲,缓冲区是一块内存区,它在输入输出设备和cpu之间,用来缓存数据。他是低速的输入输出设备和高速的cpu能够协调共工作,避免低速的输入和输出设备占用cpu。


从网上查到的一个名词叫行缓冲:当输入和输出中遇到换行符,执行真正的I/O操作。这时,我们输入的字符优先存放在缓冲区,当按下回车键换行时,才进行实际的I/O操作。其经典的标准输入(stdin)和标准输出(stdout)。这个意思也就是,一般我们从电脑端输入然后getchar要想接收字符必须要通过一个叫缓冲区的地方(这个地方用来暂放数据)来接收。


这是因为在输入字符串时,并不是一个一个输入,在我们按下键盘后字符会存放在缓冲区中,等待回车键入,而按下回车相当于键入\n,虽然不会存储到数组中,但仍在缓冲区,接下来理解getchar会读取\n并保存,


5d3f8d514a8e4bc0aeb6215c487d4b6f.png


输入A后需要按下enter建才能有效,而按完enter相当于一次换行,一开始缓冲区里面存放着A\n,然后getchar接收\n之前的字符A ,而\n还存放在缓冲区内,而下一次,就不用手动输入了,缓冲区内还有数据存着,自然getchar将\n接收,而putchar也就获取了\n而相对应的+32就是*了。


848090bc8a794876bc8a7fef125757a5.png


![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/94e93418fd0342488a51953ebeed0491.png


2ae10dcb7d8f41b7b4e139879cd1c2fd.png



解决方法


1. 前面有读数据操作,现在要执行读字符操作,则可用getchar()来吃掉前面的回车确认。

int main()
{
    char ch = 0;
    while ((ch = getchar()) != EOF)//EOF意为-1。本语句即只要输入项是字符即可打印
    {
        //因为回车也算一个字符,所以在输入第一个字符换行后,getchar会读取换行的回车键
        //换行的回车被读取,若防止回车被读取,可在其前面多读取一次消耗回车
        getchar();//吃掉回车确认符
        putchar(ch + 32);
        printf("\n");
    }
    return 0;
}


getchar注意事项


1.清除缓冲区.


  do {
      scanf("%c",&c);
    }
    while(c!='\n'); // 清除缓存区,确保下次scanf的正确读取


可以通过这样来清除缓冲区,来确保下次scanf()的正确读取。

2

.`//把缓冲区中的内容全读走


while ( getchar() != '\n')
{
  ;
}`
这样也可以喔


ff3f2dc1b56b4f798042193280c97d93.gif


又学会了一个知识点!是不是很高兴呀,嘻嘻。

相关文章
|
Java
Burpsuite的安装
Burpsuite的安装
649 0
|
Java 开发工具 Maven
svn篇2:idea中使用svn
svn篇2:idea中使用svn
6957 0
|
XML 缓存 Java
一文讲明Mybatis 的使用 超详细 【爆肝两万字教程】
文章提供了一份详尽的Mybatis使用教程,涵盖了Mybatis的简介、环境搭建、基本操作、配置解析、日志使用、分页、注解开发、多对一和一对多关系处理、动态SQL以及缓存机制等方面的内容,并提供了相应的代码示例和测试用例。
一文讲明Mybatis 的使用 超详细 【爆肝两万字教程】
|
SQL 存储 分布式计算
Hadoop-16-Hive HiveServer2 HS2 允许客户端远程执行HiveHQL HCatalog 集群规划 实机配置运行
Hadoop-16-Hive HiveServer2 HS2 允许客户端远程执行HiveHQL HCatalog 集群规划 实机配置运行
241 3
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
436 1
|
运维 监控 Devops
DevOps 文化建设:促进跨职能团队合作
【8月更文第30天】在当今快速变化的商业环境中,组织需要更快地交付高质量的产品和服务来满足客户需求。DevOps作为一种文化和实践,旨在通过改进开发(Dev)和运维(Ops)团队之间的协作来提高软件交付的速度和质量。本文将探讨如何构建一个积极的DevOps文化,并提供具体的策略和工具来加强团队间的沟通与协作。
669 2
|
NoSQL Redis
redis使用jackson序列化数据配置文件
redis使用jackson序列化数据配置文件
251 5
|
Linux 数据安全/隐私保护 Windows
linux 搭建cloudreve win映射网络驱动器WebDav
linux 搭建cloudreve win映射网络驱动器WebDav
440 2
|
XML 5G 定位技术
带你读《5G大规模天线增强技术》——2.4.9 基于地图的混合信道模型(1)
带你读《5G大规模天线增强技术》——2.4.9 基于地图的混合信道模型(1)
|
JSON JavaScript 前端开发
Qt 5.14.2 深度解析:打造高效JSON处理利器
Qt 5.14.2 深度解析:打造高效JSON处理利器
933 0