当前位置: 首页 > news >正文

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


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯函数原型及头文件包含
  • 💯 `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 的特性。
    #include <cstdio>
    
    在 C++ 程序中,通常还会包含 <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() 的深入解析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;函数原型及头文件包含&#x1f4af; getchar() 和 putchar() 的基本概念2.1 getchar() 函数2.2 putchar() 函数 &#x1f4af;输入输出的关系与返回值的解释3.1 getchar() …...

Centos7安装MySQL8.0详细教程(压缩包安装方式)

本章教程&#xff0c;主要介绍如何在Centos7上安装MySQL8.0版本数据库&#xff08;压缩包安装方式&#xff09; 一、卸载系统自带的 Mariadb 1、查询 rpm -qa|grep mariadb2.、卸载 如果有查询结果&#xff0c;就进行卸载&#xff0c;没有就跳过该步骤。 rpm -e --nodeps mar…...

深度学习的python基础(1)

一.tensor创建 1.张量的定义 张量在形式上就是多维数组&#xff0c;例如标量就是0维张量&#xff0c;向量就是一维张量&#xff0c;矩阵就是二维张量&#xff0c;而三维张量就可以想象RGB图片&#xff0c;每个channel是一个二维的矩阵&#xff0c;共有三个channel&#xff0…...

拥抱 OpenTelemetry:阿里云 Java Agent 演进实践

作者&#xff1a;陈承 背景 在 2018 年的 2 月&#xff0c;ARMS Java Agent 的第一个版本正式发布&#xff0c;为用户提供无侵入的的可观测数据采集服务。6 年后的今天&#xff0c;随着软件技术的迅猛发展、业务场景的逐渐丰富、用户规模的快速增长&#xff0c;我们逐渐发现过…...

003 MATLAB基础计算

01 方程组的求解 多项式及其运算 多项式在MATLAB中以向量形式存储。 即n次多项式用一个长度为n1的系数向量来表示&#xff0c;且按降幂&#xff0c;缺少的幂次对应的向量元素为0。 多项式的运算主要包括多项式的四则运算、求导、求值和求根运算 多项式的四则运算&#xff1a…...

安卓逆向之Android-Intent介绍

Intent是各个组件之间交互的一种重要方式&#xff0c;它不仅可以指明当前组件想要执行的动作&#xff0c;而且还能在各组件之间传递数据。Intent一般可用于启动Activity、启动Service、发送广播等场景。Intent有多个构造函数的重载。 显式intent 显式 Intent 明确指定要启动的…...

数据库日期时间用什么类型?

数据库中的日期时间类型主要包括DATE、TIME、DATETIME和TIMESTAMP等&#xff0c;它们在存储、格式和范围等方面有所不同。以下是这些类型的详细说明和异同比较&#xff1a; 1. DATE类型 用途&#xff1a;用于存储日期值&#xff0c;不包含时间部分。格式&#xff1a;YYYY-MM-…...

Python中字符串和正则表达式

Python中字符串和正则表达式 在Python编程中&#xff0c;字符串是最常用的数据类型之一。字符串用于表示文本数据&#xff0c;而正则表达式则是一种强大的工具&#xff0c;用于处理和匹配字符串中的模式。本文将介绍Python中的字符串操作、字符串格式化以及如何使用正则表达式…...

Leecode刷题C语言之N皇后

执行结果:通过 执行用时和内存消耗如下&#xff1a; 代码如下&#xff1a; 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技术加持下的社交体验

即时通讯作为互联网的重要应用之一&#xff0c;见证了中国互联网30年发展的辉煌历程。 它从最初的文字交流&#xff0c;发展到如今的语音、视频通话&#xff0c;甚至是虚拟现实社交&#xff0c;已经渗透到生活的社交、娱乐、商务等方方面面&#xff0c;成为现代社会不可或缺的一…...

repo仓库转移到自己本地的git服务器

前提条件&#xff1a;搭建好gitolite 以转移正点原子rk3568_linux工程为例子&#xff0c;将其转移到自己的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 关系数据…...

人工智能-深度学习-神经网络-激活函数

激活函数通过引入非线性来增强神经网络的表达能力&#xff0c;对于解决线性模型的局限性至关重要。由于反向传播算法(BP)用于更新网络参数&#xff0c;因此激活函数必须是可微的&#xff0c;也就是说能够求导的。 满足激活函数的条件 1.可微分&#xff0c;也就是可求导 激活函…...

vue3+ts+uniapp微信小程序顶部导航栏

这是colorui改的&#xff0c;不用就不用看啦 color-ui(https://docs.xzeu.com/#/) 新建component文件夹创建topNavigation.vue <template><view><view class"cu-custom" :style"height: CustomBar px"><view class"cu-bar…...

IAR中编译下载未下载问题

第一张图片是正常下载&#xff0c;第二张未正常下载。经过查看download选项发现 启用了 suppress download &#xff08;禁用下载)...

springboot(20)(删除文章分类。获取、更新、删除文章详细)(Validation分组校验)

目录 一、删除文章分类功能。 &#xff08;1&#xff09;接口文档。 1、请求路径、请求参数。 2、请求参数。 3、响应数据。 &#xff08;2&#xff09;实现思路与代码书写。 1、controller层。 2、service接口业务层。 3、serviceImpl实现类。 4、mapper层。 5、后端接口测试。…...

英语系统语法书面记载:高级语法 8 的状语从句

在英语高级语法中&#xff0c;状语从句是一种用来修饰动词、形容词、副词或整个句子的从句&#xff0c;它提供有关时间、地点、原因、条件、方式、让步等信息。状语从句通常由特定的连词引导。以下是常见的几种状语从句类型及其用法&#xff1a; 1. 时间状语从句 (Adverbial Cl…...

C语言:深入理解指针(1)

一.内存和地址 在讲内存和地址之前&#xff0c;我们想有个生活中的案例&#xff1a; 假设有一栋宿舍楼&#xff0c;把你放在楼里&#xff0c;楼上有100个房间&#xff0c;但是房间没有编号&#xff0c;你的一个朋友来找你玩&#xff0c;如果想找到你&#xff0c;就得挨个房子去…...

priority_queue--优先队列

一、认识优先队列 priority_queue&#xff08;优先队列&#xff09;是 C 标准模板库&#xff08;STL&#xff09;中的一个容器适配器。它的底层实现通常是用堆&#xff08;一般是二叉堆&#xff09;来实现的。优先队列中的元素按照一定的优先级顺序进行排列&#xff0c;在队首的…...

Paper -- 建筑物高度估计 -- 基于深度学习、图像处理和自动地理空间分析的街景图像建筑高度估算

论文题目: Building height estimation from street-view imagery using deep learning, image processing and automated geospatial analysis 中文题目: 基于深度学习、图像处理和自动地理空间分析的街景图像建筑高度估算 作者: Ala’a Al-Habashna, Ryan Murdoch 作者单位: …...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...