【C++】getchar() 与 putchar() 的深入解析

文章目录
- 💯前言
- 💯函数原型及头文件包含
- 💯 `getchar()` 和 `putchar()` 的基本概念
- 2.1 `getchar()` 函数
- 2.2 `putchar()` 函数
- 💯输入输出的关系与返回值的解释
- 3.1 `getchar()` 的返回值
- 3.2 `putchar()` 的返回值
- 💯示例代码与输出解释
- 运行结果
- 💯进一步的代码示例与详细分析
- 5.1 示例代码 1:`getchar()` 和换行符的影响
- 运行结果与解释
- 5.2 示例代码 2:逐个分析字符的读取与输出
- 运行结果与标注
- 💯分析与理解
- 6.1 行为与返回值的区别
- 6.2 为什么 `putchar()` 返回 ASCII 码
- 💯编译器行为与头文件包含
- 💯实验与优化
- 💯`getchar()` 和 `putchar()` 的结合使用
- 💯小结

💯前言
getchar()和putchar()是 C/C++ 编程语言中的两个基础字符输入输出函数,主要用于逐字符的数据交互。这两个函数的使用体现了计算机系统底层处理输入输出的方式,有助于理解更复杂的I/O 操作原理。本文将系统性地探讨它们的定义、功能、返回值、实际应用示例以及常见的使用问题,以便为读者提供关于这两个函数的深入认识。
C++ 参考手册

getchar

putchar

💯函数原型及头文件包含
getchar()和putchar()的原型定义在标准 I/O 库头文件<cstdio>中,在 C++ 中也可以通过包含<stdio.h>来使用这些函数,以兼容 C 的特性。
在 C++ 程序中,通常还会包含#include <cstdio><iostream>,以便使用如cout等流对象进行复杂的输出操作。虽然getchar()和putchar()是 C 标准库的函数,但由于 C++ 具有对 C 的兼容性,因此可以在 C++ 中无缝使用这些函数。

💯 getchar() 和 putchar() 的基本概念
![]()
2.1 getchar() 函数
getchar

- 定义:
int getchar(void); - 功能:
getchar()从标准输入(通常是键盘)中读取一个字符。当程序执行到getchar()时,它会暂停并等待用户输入一个字符并按下回车键。 - 返回值:函数返回读取到的字符的 ASCII 值,数据类型为
int,以便与EOF这样的特殊值兼容。如果输入失败或者到达文件的末尾,getchar()会返回EOF(通常为 -1)。 - 特点:
getchar()并不会忽略输入中的空格、换行符等字符,它会按顺序读取所有输入字符,包括这些空白字符。
2.2 putchar() 函数
putchar

- 定义:
int putchar(int character); - 功能:
putchar()将参数指定的字符输出到标准输出(通常是屏幕)。参数为字符的 ASCII 值,因此通常用int类型传递。 - 返回值:函数返回所输出字符的 ASCII 值,如果输出失败则返回
EOF。这一设计使得程序可以检测输出操作的成功与否,便于错误处理。 - 使用场景:
putchar()常用于逐一输出字符,通常在实现字符流处理时因其简单而被优先选择。
💯输入输出的关系与返回值的解释
![]()
3.1 getchar() 的返回值
getchar()的返回值为读取到的字符的 ASCII 值。例如,如果用户输入a,则getchar()的返回值为97。- 如果读取失败或者遇到文件的结束标志,
getchar()会返回EOF,通常是-1。在控制台中,按下Ctrl+Z(Windows)或者Ctrl+D(Linux/Mac)可以模拟EOF,以标识输入的结束。#include <iostream> #include <cstdio> using namespace std;int main() {int ch = getchar(); // 从标准输入读取一个字符,存储到变量 ch 中cout << ch << endl; // 输出 ch 的整数值(ASCII 码)return 0; }
3.2 putchar() 的返回值
putchar()的主要功能是将字符输出,但它同时返回被输出字符的 ASCII 值。- 这一返回值并不是用于再度输出,而是为了让程序员检测输出是否成功。例如,调用
putchar('a'),除了在屏幕上输出字符a,函数还会返回97,以确保输出过程是成功的。#include <iostream> #include <cstdio> using namespace std;int main() {int ch = getchar(); // 读取一个字符int a = putchar(ch); // 输出字符,同时返回该字符的 ASCII 值putchar('\n');cout << a << endl; // 输出返回值(即 ASCII 值)return 0; }
💯示例代码与输出解释
以下代码展示了 getchar() 和 putchar() 的基本用法,并通过返回值验证它们的工作原理:
#include <iostream>
#include <cstdio>
using namespace std;int main() {int ch = getchar(); // 读取一个字符,返回 ASCII 值int a = putchar(ch); // 输出字符,返回 ASCII 值putchar('\n'); // 输出一个换行符cout << a << endl; // 输出 putchar 的返回值return 0;
}

运行结果
![]()
- 输入:
a - 输出:
a 97- 第一行输出字符
a,这是putchar(ch)的行为。 - 第二行输出
97,这是putchar()的返回值(ASCII 码)。
- 第一行输出字符
💯进一步的代码示例与详细分析
![]()
5.1 示例代码 1:getchar() 和换行符的影响
#include <iostream>
#include <cstdio>
using namespace std;int main() {int ch = getchar(); // 第一次调用 getchar()cout << ch << endl; // 输出 ch 的整数值(ASCII 码)cout << (char)ch << endl; // 输出 ch 对应的字符cout << "xxxx" << endl; // 输出 "xxxx"ch = getchar(); // 第二次调用 getchar()cout << (char)ch; // 输出第二次读取的字符return 0;
}

运行结果与解释
- 输入:
a+ 回车键 - 输出:
a 97 a xxxx- 第一次
getchar()读取到字符a,其 ASCII 码是97,因此输出97。 - 接下来通过
(char)ch转换后,输出字符a。 - 然后输出字符串
xxxx。 - 第二次调用
getchar()读取到回车符(即换行符\n),直接输出了换行。

- 第一次
5.2 示例代码 2:逐个分析字符的读取与输出
以下是对每个步骤详细标注的代码示例:
#include <iostream>
#include <cstdio>
using namespace std;int main() {int ch = getchar(); // 读取用户输入的字符cout << ch << endl; // 输出该字符的 ASCII 值cout << (char)ch; // 输出该字符本身ch = getchar(); // 读取换行符(因为上一次输入后的回车还在缓冲区中)cout << ch << endl; // 输出换行符的 ASCII 值(10)cout << (char)ch; // 输出换行符,表现为换行cout << "xxxx" << endl; // 输出字符串 "xxxx"return 0;
}

运行结果与标注

- 输入:
a+ 回车键 - 输出:
97 a10xxxx- 第一行:输出字符
a的 ASCII 值97。 - 第二行:输出字符
a本身。 - 第三行:读取到换行符,其 ASCII 值为
10。 - 第四行:输出换行符,表现为换行。
- 最后输出字符串
xxxx。
- 第一行:输出字符
💯分析与理解
![]()
6.1 行为与返回值的区别
![]()
- 行为:
getchar()和putchar()的行为分别是从标准输入读取字符和向标准输出输出字符。 - 返回值:这两个函数的返回值都是字符的 ASCII 码。在 C/C++ 中,字符本质上是一个整数类型,因此返回 ASCII 值便于在逻辑处理中使用。
| 特性 | getchar() | putchar() |
|---|---|---|
| 功能 | 从标准输入读取单个字符 | 向标准输出输出单个字符 |
| 返回值 | 返回读取字符的 ASCII 值 | 返回输出字符的 ASCII 值 |
| 头文件 | <cstdio> 或 <stdio.h> | <cstdio> 或 <stdio.h> |
| 典型用途 | 处理字符输入 | 处理字符输出 |
| 失败返回值 | EOF(通常为 -1) | EOF(输出失败) |
| 字符类型 | 返回值为 int(存储 ASCII 值) | 参数为 int(传入 ASCII 值) |
6.2 为什么 putchar() 返回 ASCII 码
![]()
- 在 C/C++ 的设计中,返回字符的 ASCII 码是为了便于程序员对输出进行进一步验证或处理,例如判断输出是否成功。
- 如果输出失败(如设备错误),
putchar()会返回EOF,以便程序能够进行错误处理。此机制使得程序更具健壮性,尤其在处理底层字符设备时。
💯编译器行为与头文件包含
![]()
在之前的讨论中,我们发现即使没有显式包含 <cstdio>,某些编译器仍能使 getchar() 正常工作。这是因为现代编译器(如 GCC、Clang 等)在编译时会自动引入常用的标准头文件。尽管如此,为了确保代码的可移植性和可读性,显式包含所需的头文件仍然是一个良好的编程习惯:
#include <cstdio>
#include <iostream>
这样可以确保代码在所有平台和编译器上都能够一致地工作,避免因隐式包含导致的不可预测行为。
💯实验与优化
![]()
在我们的实验中,通过加入换行符 putchar('\n'),使输出更为整洁和易于阅读。尤其是在调试和逐步验证输出结果时,每个输出项独立占行有助于清楚地理解每个步骤的效果。
- 优化输出格式:加入
putchar('\n')或使用cout << endl;可以显著提高输出结果的可读性,这对于编写和调试程序来说非常有帮助。
💯getchar() 和 putchar() 的结合使用
getchar() 和 putchar() 常结合使用,用于逐字符的输入输出操作。例如:
#include <cstdio>
int main() {int ch;while ((ch = getchar()) != EOF) { // 逐字符读取直到遇到 EOFputchar(ch); // 输出相同的字符}return 0;
}

功能:这个程序从输入中逐字符读取,直到遇到 EOF(输入结束),并将每个字符原样输出。此类代码经常用于字符过滤或简单的文本处理程序。
💯小结
-

getchar()和putchar()的核心功能:一个用于从标准输入接收字符,一个用于向标准输出输出字符。它们的简洁性使得它们特别适用于底层的字符输入输出处理。 -
返回值是 ASCII 值:这两个函数的返回值均为字符的 ASCII 值,这种设计使得它们不仅可以用于输出字符,还能在逻辑处理中使用这些返回值,以判断输入输出是否成功。
-
现代编译器特性:尽管某些编译器可以自动包含标准头文件,但为了代码规范和在不同编译器之间的移植性,显式包含头文件是最佳实践。
-
适用场景:这些函数适用于需要高效、低级别的字符输入输出操作,通常在编写如字符过滤器、命令行工具或嵌入式系统程序等对资源要求较高的应用中非常有用。

相关文章:
【C++】getchar() 与 putchar() 的深入解析
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯函数原型及头文件包含💯 getchar() 和 putchar() 的基本概念2.1 getchar() 函数2.2 putchar() 函数 💯输入输出的关系与返回值的解释3.1 getchar() …...
Centos7安装MySQL8.0详细教程(压缩包安装方式)
本章教程,主要介绍如何在Centos7上安装MySQL8.0版本数据库(压缩包安装方式) 一、卸载系统自带的 Mariadb 1、查询 rpm -qa|grep mariadb2.、卸载 如果有查询结果,就进行卸载,没有就跳过该步骤。 rpm -e --nodeps mar…...
深度学习的python基础(1)
一.tensor创建 1.张量的定义 张量在形式上就是多维数组,例如标量就是0维张量,向量就是一维张量,矩阵就是二维张量,而三维张量就可以想象RGB图片,每个channel是一个二维的矩阵,共有三个channel࿰…...
拥抱 OpenTelemetry:阿里云 Java Agent 演进实践
作者:陈承 背景 在 2018 年的 2 月,ARMS Java Agent 的第一个版本正式发布,为用户提供无侵入的的可观测数据采集服务。6 年后的今天,随着软件技术的迅猛发展、业务场景的逐渐丰富、用户规模的快速增长,我们逐渐发现过…...
003 MATLAB基础计算
01 方程组的求解 多项式及其运算 多项式在MATLAB中以向量形式存储。 即n次多项式用一个长度为n1的系数向量来表示,且按降幂,缺少的幂次对应的向量元素为0。 多项式的运算主要包括多项式的四则运算、求导、求值和求根运算 多项式的四则运算:…...
安卓逆向之Android-Intent介绍
Intent是各个组件之间交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,而且还能在各组件之间传递数据。Intent一般可用于启动Activity、启动Service、发送广播等场景。Intent有多个构造函数的重载。 显式intent 显式 Intent 明确指定要启动的…...
数据库日期时间用什么类型?
数据库中的日期时间类型主要包括DATE、TIME、DATETIME和TIMESTAMP等,它们在存储、格式和范围等方面有所不同。以下是这些类型的详细说明和异同比较: 1. DATE类型 用途:用于存储日期值,不包含时间部分。格式:YYYY-MM-…...
Python中字符串和正则表达式
Python中字符串和正则表达式 在Python编程中,字符串是最常用的数据类型之一。字符串用于表示文本数据,而正则表达式则是一种强大的工具,用于处理和匹配字符串中的模式。本文将介绍Python中的字符串操作、字符串格式化以及如何使用正则表达式…...
Leecode刷题C语言之N皇后
执行结果:通过 执行用时和内存消耗如下: 代码如下: int solutionsSize;char** generateBoard(int* queens, int n) {char** board (char**)malloc(sizeof(char*) * n);for (int i 0; i < n; i) {board[i] (char*)malloc(sizeof(char) * (n 1))…...
即时通讯| IM+RTC在AI技术加持下的社交体验
即时通讯作为互联网的重要应用之一,见证了中国互联网30年发展的辉煌历程。 它从最初的文字交流,发展到如今的语音、视频通话,甚至是虚拟现实社交,已经渗透到生活的社交、娱乐、商务等方方面面,成为现代社会不可或缺的一…...
repo仓库转移到自己本地的git服务器
前提条件:搭建好gitolite 以转移正点原子rk3568_linux工程为例子,将其转移到自己的git服务器。 获取完整repo仓库 将正点原子epo仓库sync出来 evanevan-X99:~/SRC/atk$ .repo/repo/repo sync -l -j10 evanevan-X99:~/SRC/atk$ .repo/repo/repo list -n…...
微服务即时通讯系统的实现(服务端)----(2)
目录 1. 语音识别子服务的实现1.1 功能设计1.2 模块划分1.3 模块功能示意图1.4 接口的实现 2. 文件存储子服务的实现2.1 功能设计2.2 模块划分2.3 模块功能示意图2.4 接口的实现 3. 用户管理子服务的实现3.1 功能设计3.2 模块划分3.3 功能模块示意图3.4 数据管理3.4.1 关系数据…...
人工智能-深度学习-神经网络-激活函数
激活函数通过引入非线性来增强神经网络的表达能力,对于解决线性模型的局限性至关重要。由于反向传播算法(BP)用于更新网络参数,因此激活函数必须是可微的,也就是说能够求导的。 满足激活函数的条件 1.可微分,也就是可求导 激活函…...
vue3+ts+uniapp微信小程序顶部导航栏
这是colorui改的,不用就不用看啦 color-ui(https://docs.xzeu.com/#/) 新建component文件夹创建topNavigation.vue <template><view><view class"cu-custom" :style"height: CustomBar px"><view class"cu-bar…...
IAR中编译下载未下载问题
第一张图片是正常下载,第二张未正常下载。经过查看download选项发现 启用了 suppress download (禁用下载)...
springboot(20)(删除文章分类。获取、更新、删除文章详细)(Validation分组校验)
目录 一、删除文章分类功能。 (1)接口文档。 1、请求路径、请求参数。 2、请求参数。 3、响应数据。 (2)实现思路与代码书写。 1、controller层。 2、service接口业务层。 3、serviceImpl实现类。 4、mapper层。 5、后端接口测试。…...
英语系统语法书面记载:高级语法 8 的状语从句
在英语高级语法中,状语从句是一种用来修饰动词、形容词、副词或整个句子的从句,它提供有关时间、地点、原因、条件、方式、让步等信息。状语从句通常由特定的连词引导。以下是常见的几种状语从句类型及其用法: 1. 时间状语从句 (Adverbial Cl…...
C语言:深入理解指针(1)
一.内存和地址 在讲内存和地址之前,我们想有个生活中的案例: 假设有一栋宿舍楼,把你放在楼里,楼上有100个房间,但是房间没有编号,你的一个朋友来找你玩,如果想找到你,就得挨个房子去…...
priority_queue--优先队列
一、认识优先队列 priority_queue(优先队列)是 C 标准模板库(STL)中的一个容器适配器。它的底层实现通常是用堆(一般是二叉堆)来实现的。优先队列中的元素按照一定的优先级顺序进行排列,在队首的…...
Paper -- 建筑物高度估计 -- 基于深度学习、图像处理和自动地理空间分析的街景图像建筑高度估算
论文题目: Building height estimation from street-view imagery using deep learning, image processing and automated geospatial analysis 中文题目: 基于深度学习、图像处理和自动地理空间分析的街景图像建筑高度估算 作者: Ala’a Al-Habashna, Ryan Murdoch 作者单位: …...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
起重机起升机构的安全装置有哪些?
起重机起升机构的安全装置是保障吊装作业安全的关键部件,主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理: 一、超载保护装置(核心安全装置) 1. 起重量限制器 功能:实时监测起升载荷&a…...
