当前位置: 首页 > 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 作者单位: …...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...