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

【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
    a10
    
    xxxx
    
    • 第一行:输出字符 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) { // 逐字符读取直到遇到 EOF
        putchar(ch);                 // 输出相同的字符
    }
    return 0;
}

在这里插入图片描述

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


💯小结

  • 在这里插入图片描述
    getchar()putchar() 的核心功能:一个用于从标准输入接收字符,一个用于向标准输出输出字符。它们的简洁性使得它们特别适用于底层的字符输入输出处理

  • 返回值是 ASCII 值:这两个函数的返回值均为字符的 ASCII 值,这种设计使得它们不仅可以用于输出字符,还能在逻辑处理中使用这些返回值,以判断输入输出是否成功。

  • 现代编译器特性:尽管某些编译器可以自动包含标准头文件,但为了代码规范和在不同编译器之间的移植性,显式包含头文件最佳实践

  • 适用场景:这些函数适用于需要高效、低级别的字符输入输出操作,通常在编写如字符过滤器命令行工具嵌入式系统程序等对资源要求较高的应用中非常有用


在这里插入图片描述



http://www.kler.cn/a/418396.html

相关文章:

  • 【k8s深入理解之 Scheme 补充-1】理解 Scheme 中资源的注册以及 GVK 和 go 结构体的映射
  • CentOS使用chrony服务进行时间同步源设置脚本
  • WEB攻防-通用漏洞CSRFSSRF协议玩法内网探针漏洞利用
  • B站狂神说Mybatis+Spring+SpringMVC整合理解(ssm框架整合)
  • 微信小程序首页搜索框的实现教程
  • AIGC--------AIGC在医疗健康领域的潜力
  • Transformer?Attention?——Are All You Need!
  • 2个方法教打开把Word文档转换为PDF格式
  • 如何在本地环境中模拟使用https
  • TCP/IP协议簇自学笔记
  • ros2键盘实现车辆: 简单的油门_刹车_挡位_前后左右移动控制
  • 面阵相机的使用和注意事项
  • 基于树莓派3B+的简易智能家居小项目(WiringPi库 + C语言开发)
  • 数据结构(理解)
  • 数据治理体系一般要求
  • Hive高可用配置
  • 33.2 prometheus联邦功能源码解读和它的问题
  • 【深度学习】服务器常见命令
  • 【JavaEE】多线程(2)
  • 【汇编】逻辑指令
  • 重生之我在异世界学编程之C语言:二维数组篇
  • vue 2 父组件根据注册事件,控制相关按钮显隐
  • 1 MyBatis 的增删改查操作
  • 瑞芯微rv1106的自带的录音和播放功能
  • 图论入门教程:GTM173 Graph Theory
  • centos里docker安装jenkins