getchar---解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 知识点—缓冲区缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内冲空间预留了一定的储存空间,这些储存空间用来缓冲输入或者输出的数据,这部分预留的空间就叫做缓冲区。这里一般操作系统上会讲,缓冲区是一块内存区,它在输入输出设备和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


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

相关文章
|
8月前
|
C语言
你真的学会了printf和scanf函数吗?
你真的学会了printf和scanf函数吗?
VS中出现的printf,scanf等函数不安全而报错的问题的全面解决方法
VS中出现的printf,scanf等函数不安全而报错的问题的全面解决方法
|
5月前
|
Shell C语言 开发者
printf命令
`printf`命令是Shell脚本和许多编程语言中强大的输出工具。它提供了广泛的数据格式化选项,使得输出更加灵活和精确。了解并熟练使用 `printf`能够大幅提升脚本和程序的输出质量,是每个开发者和系统管理员应该掌握的技能。
66 3
|
8月前
|
存储 缓存 编译器
C语言第四弹---printf和scanf详解
C语言第四弹---printf和scanf详解
|
8月前
|
编译器 C语言 C++
【C语言】分支和循环 ---- if、switch、while、for、goto语句, 理解getchar和putchar函数
【C语言】分支和循环 ---- if、switch、while、for、goto语句, 理解getchar和putchar函数
58 0
|
8月前
|
C语言 C++
C语言变量、地址、字符及printf()/sizeof()/scanf()函数介绍
C语言变量、地址、字符及printf()/sizeof()/scanf()函数介绍
39 0
|
缓存
scanf和printf函数
scanf和printf函数
159 0
|
存储 Linux C语言
深入解析Linux环境下的sprintf()和printf()函数
在C语言中,`sprintf()`和`printf()`函数是用于格式化输出的两个重要函数。`sprintf()`函数将格式化的数据写入一个字符串,而`printf()`函数则将格式化的数据输出到标准输出。在Linux环境中,这两个函数被广泛应用于各种编程任务。本文将详细介绍这两个函数的用法,包括格式化字符串的语法和一些常见的使用场景。
590 1
%md在printf语句和scanf语句中的区别
%md在printf语句和scanf语句中的区别
|
C语言
printf与scanf函数的返回值
printf与scanf函数的返回值