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