【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 作者单位: …...
开发一套ERP 第八弹 RUst 插入数据
更全面的报错,方便检查错误在哪里,现代高级语言越来越智能 还是得看下原文档怎么操作的 src 目录为crate 的根目录 想在crate 中模块相互引入需要在 main 中声明,各个模块,然后才能在各个模块中相互引入和使用 原始工程引入,避免直接使用 lib.rs 回合cargo 中的一些 工程管理出…...
回退用 git revert 还是 git reset?
git revert 会生成一个新的 commit 来记录此次操作;git reset 是把 HEAD 指针向前挪动一次,会减少一个 commit。 回退用 git revert 回退还是用 git reset,核心就一点: 是否需要记录这次回退。 如果需要记录这次回退,…...
【docker】多阶段构建与基础构建,及企业案例展示
基础构建与多阶段构建对比 基础构建(单阶段构建) 在基础构建中,所有构建过程和最终的应用程序都在同一个镜像中进行,构建工具和最终应用程序都会在最终镜像中。 这样构建镜像时会包含所有的构建工具和依赖,因此最终镜…...
基于链表的基础笔试/面试题
1. 反转链表 问题描述:反转一个单向链表。 示例: 输入:1 → 2 → 3 → 4 → 5 输出:5 → 4 → 3 → 2 → 1 class ListNode {int val;ListNode next;ListNode(int x) {val x;} }public class LinkedList {public ListNode …...
SARIMA 模型Matlab代码
% 导入数据 data readtable(data.xlsx); % 假设数据在第一列 y data{:, 1}; % 获取第一列数据% 划分训练集和测试集,80% 训练,20% 测试 trainSize floor(0.8 * length(y)); trainData y(1:trainSize); testData y(trainSize1:end);% 创建时间序列…...
第八课 Unity编辑器创建的资源优化_特效篇(Particle System)详解
无论是CPU还是GPU,粒子系统对其的影响面都是不容小觑的。随着项目的重度化和3A化,玩家的口味变挑剔了、游戏玩法复杂度变高了、画面的特效表现变复杂了......所以我们还是更加谨慎地对待粒子系统。 特效(Particle System) 游戏效…...
Oracle对比表与表之间的结构
自己首先想到的就是,navicat有提供结构同步 但是有些时候情况不一样,比如我遇到的是连接不同,而且是互相同步,以最多的列的那个表为样 没有说一个固定的源 那么还可以通过导出表结构去另一个库中执行看是否报错,以此来判断结构的不同 但是我感觉有点儿麻烦 最后想到通过sql语…...
基于JSP+MySQL的网上招聘系统的设计与实现
摘要 在这样一个经济飞速发展的时代,人们的生存与生活问题已成为当代社会需要关注的一个焦点。对于一个刚刚 踏入社会的年轻人来说,他对就业市场和形势了解的不够详细,同时对自己的职业规划也很模糊,这就导致大量的 时间被花费在…...
【Linux】进程地址空间(虚拟地址vs物理地址vs页表)
Linux 进程概念补充【Linux】 进程是什么(不熟悉的兄弟可以看看)。 1. C/C内存分布图 对于有c/c基础的同学相信对上面的图片并不陌生,实际上其描述的并不是正真的物理内存,而是虚拟内存,我们把它叫做进程地址空间 。 2…...
pytorch 融合 fuse 学习笔记
目录 fuse_lora 作用是什么 fuse_modules源码解读 fuse_lora 作用是什么 在深度学习模型微调场景下(与 LoRA 相关) 参数融合功能 在使用 LoRA(Low - Rank Adaptation)对预训练模型进行微调后,fuse_lora函数的主要作…...
品牌网站建设/谷歌推广哪家公司好
接上一章 ASDM访问防火墙 ASA 防火墙访问控制的配置 关于配置一条全通的 global 策略 在 Configuration > Firewall > Access Rules 里面。添加一条全通的 global 策略,添加后发现居然ping不通。 解决方法如下: 1.检查 Device Setup–Interfaces里…...
广东官方移动网站建设哪家好/营销的主要目的有哪些
JetBrain官网——传送门 plugin 下载 在gitee下载 plugin 使用 打开软件(打开一个项目) 将Plugin(压缩包) 直接拖进去 End...
wordpress 媒体备份/百度云盘搜索引擎入口
1. 获取最近运行容器的id 这是我们经常会用到的一个操作,按照官方示例,你可以这样做(环境ubuntu): $ ID$(docker run ubuntu echo hello world)hello world$ docker commit $ID helloworldfd08a884dc79这种方式在编写脚…...
遂宁市城市建设档案馆网站/济南网络推广公司
https://lihkstyle.iteye.com/category/292765转载于:https://www.cnblogs.com/Joy-Hu/p/10830652.html...
织梦上网站次导航怎么做/关键词seo资源
昨天,2018京东人工智能创新峰会举行,京东集团副总裁、AI 平台与研究部负责人周伯文揭开了京东技术布局下的 AI 战略全景图。这个全景图概括起来说就是“三大主体、七大应用场景和五个人工智能产业化的布局方向”,即:以 AI 开放平台…...
电商网站建设日程表/近期时事新闻10条
问:请问购买了一台华为AX3Pro路由器怎么从原来旧路由器获取宽带账号密码呢?家里的宽带账号密码找不到了,华为AX3Pro答:华为或荣耀的路由器均支持新旧路由器换机的功能,也就是从旧路由器通过克隆宽带账号密码的功能实现…...