函数解剖——深挖getchar()与putchar()

简介: 函数解剖——深挖getchar()与putchar()

995d59282b7d46ceac1f5fd8b4f3deda.png

大家好,我是一只励志要翻身的小牛🐮,今天我们刨根问底,探究getchar()与putchar()的那点事!


一、详解字符输入函数getchar()

1、函数getchar()原型

目前我们要做的是从宏观上考察函数getchar()的特点,就像你认识一个陌生人时,在对它进行深入了解之前,先看看它的外貌和举止一样。下面我们对getchar()函数给出如下描述:👇

特征:函数getchar()的返回值为int类型

          函数getchar()的参数为空

功能:它的作用是从stdin流中读入一个字符

注意:函数getchar()没有参数,函数的返回值就是从终端键盘读入的字符。其实这里就暗示了函数getchar()的参数是stdin——标准输入(这里指键盘输入)

问:既然返回值是读入的字符,为什么是int类型?

答:在C语言中,字符在存储的时候实际上是以ASCII码值进行存储的,每个字符都有对应的ASCII码值。所以既可以用char接受返回值,也可以用int接受返回值。

2、函数getchar()的输入原理

(1)函数getchar()采用行缓冲输入方式,即输入的字符先被放到输入缓冲区中,getchar()每次从输入缓冲区中读取一个字符,直到遇到回车键(回车键 \n 也一同被放到输入缓冲区)或者文件结束标志EOF时程序才认为输入结束。也就是说如果stdin有数据的话不用输入它就可以直接读取了,第一次调用getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了。

(2)也就是说,用getchar()读取字符实际上是按照文件的方式读取的,文件中一般都是以行为单位的,因此getchar()也是以行为单位读取的,这就是为什么getchar()结束输入或退出时要读到一个换行符或文件结束符EOF(vs编译器中EOF为Ctrl+z)

3、实践出真知

观察如下代码,分析输入打印过程:👇

//分别打印a、b、c、d
#include<stdio.h>
int main()
{
  int count = 0;
  int ch = 0;
  while((ch=getchar())!=EOF)
  {
    count++;
    printf("第%d次打印%c\n",count,ch);
  }
  return 0;
}

详解:从输出结果可以看出,我们从头到尾只输入了一次:abcd 当我们回车,键入数据后,每循环一次屏幕上打印一行数据,当打印完a、b、c、d四行数据后,由于输入缓冲区中还剩一回车(\n)所以第五次循环打印回车(\n),此时因为未遇到结束符EOF所以屏幕光标继续闪烁等待输入,此时在VS编译器下键入Ctrl+z使循环停止。如图:

注意:在一般情况下,getchar()的返回值是终端所输入的字符,这些字符在系统中对应的ASCII码值通常都是非负的。但有时getchar()也可能返回负值即EOF(大多数编译器下EOF为-1)这时将getchar()的返回值赋给char型变量是不合适的,因此为了让定义的变量包含getchar()返回的所有可能值,我们通常将其返回值赋给int类型变量。


二、详解字符输出函数putchar()

1、函数putchar()原型

特征:函数putchar()的返回值为int类型

          函数putchar()的参数为 character-- 这是要被写入的字符。该字符以其对应的 int 值进行传递。

功能:把参数 char 指定的字符(一个无符号字符)写入到标准输出 stdout

1ebf8bc48da8402e98bc434dd2730b79.png

2、函数putchar()的输出方式

putchar函数的基本格式为:putchar(c),通常与getchar()结合使用:

(1)当c为一个被单引号(英文状态下)引起来的字符时,输出该字符(注:该字符也可为转义字符);

(2)当c为一个介于0~127(包括0及127)之间的十进制整型数时,它会被视为对应字符的ASCII代码,输出该ASCII代码对应的字符;

(3)当c为一个事先用char定义好的字符型变量时,输出该变量所指向的字符。

注意:函数putchar()一次传递一个参数,输出一个字符

3、实践出真知

1、输出ABC

#include<stdio.h>
int main()
{
  putchar('A');
  putchar(66);
  char ch = 'C';
  putchar(ch);
  return 0;
}
//输出:ABC

2、使用getchar()、putchar()实现输入A,打印A

#include<stdio.h>
int main()
{
  int ch = getchar();
  putchar(ch);
  return 0;
}
//输入:A
//打印:A

三、结语

好啦,今天的全部内容就到这里了,如果本文对你有所帮助的话,请给博主一个一键三连哦,您的支持就是我写作的动力🥰铁汁们保持Coding,我们下期再见!


相关文章
|
28天前
|
存储 数据采集 供应链
数据中台是什么?怎么搭建数据中台?
本文深度解析数据中台本质:非“管数据”,而是让数据“流动起来、用起来”。厘清其作为统一数据能力平台的定位,详解六大核心架构模块(采集、存储计算、治理安全、服务化、组织、性能),并给出从0到1落地四阶段路径,同时警示三大常见误区。
|
4月前
|
传感器 数据采集 监控
[开源免费]基于STM32的心率监控仪 —— 从原理到实现的完整技术解析
本文详解基于STM32的心率监控仪设计,涵盖硬件搭建、ADC采样、峰值检测算法及OLED波形显示。采用STM32F103C8T6与PulseSensor实现心率实时监测,支持报警提示与按键交互,适合嵌入式入门与课程实践。
|
算法 安全 C++
【C++ 泛型编程 入门篇】深入探索C++的numeric_limits:全面理解数值界限(一)
【C++ 泛型编程 入门篇】深入探索C++的numeric_limits:全面理解数值界限
921 0
|
数据采集 数据挖掘 数据处理
如何使用 Pandas 库进行数据清洗和预处理?
数据清洗和预处理是数据分析中至关重要的步骤,Pandas库提供了丰富的函数和方法来完成这些任务
912 64
|
算法 PyTorch 计算机视觉
改进的yolov5目标检测-yolov5替换骨干网络-yolo剪枝(TensorRT及NCNN部署)-2
改进的yolov5目标检测-yolov5替换骨干网络-yolo剪枝(TensorRT及NCNN部署)-2
改进的yolov5目标检测-yolov5替换骨干网络-yolo剪枝(TensorRT及NCNN部署)-2
|
存储 Linux
Linux内核中的current机制解析
总的来说,current机制是Linux内核中进程管理的基础,它通过获取当前进程的task_struct结构的地址,可以方便地获取和修改进程的信息。这个机制在内核中的使用非常广泛,对于理解Linux内核的工作原理有着重要的意义。
567 11
|
JavaScript 前端开发 测试技术
详细介绍 Vue3 的常见目录结构
详细介绍 Vue3 的常见目录结构
1553 2
|
JavaScript 测试技术 开发者
IPD流程验证阶段模板及表单
在IPD流程的验证阶段,不仅涉及功能测试,更注重确保产品符合市场需求,包括审视市场、客户、财务假设,及时调整。此阶段强调基于市场的开发,检查发布计划、销售准备,验证开发假设,确保功能、制造准备就绪。活动涵盖试生产测试、系统验证、受控销售等。相关表单如成本核算、Bug分析报告、测试报告等在IPD资源群更新,详情见链接。由《硬件产品经理》作者卫朋分享。
792 2
|
关系型数据库 芯片
ovp过压过流保护芯片,大电流限流,高压,选型大齐全
本文介绍了过压保护(OVP)和过流限流保护(OCP)的基本概念及其应用场景,如蓝牙耳机、充电宝等。文中推荐了几款平芯微的OVP/OCP保护芯片,包括单OVP芯片PW1600、W2609A、PW2605,以及OVP和OCP二合一的PW1605、PW1558A、PW1515等,详细列出了各芯片的主要特点和适用范围。
ovp过压过流保护芯片,大电流限流,高压,选型大齐全
2节串联锂电池充电管理芯片,有5V升压,9-12V降压,快充升降压
2节串联锂电池供电电压范围为6V-8.4V,标称7.4V。根据输入电压不同,需选择不同模式的充电管理芯片。5V输入需升压型,9V、12V输入需降压型,5V-20V输入需升降压型。推荐PW4284、PW4084、PW4203等型号,适用于各种应用场景。