在 C++ 中,getchar和putchar是从 C 标准库继承的字符输入 / 输出函数,定义在<cstdio>头文件中。它们主要用于单个字符的输入和输出,用法简单但需要注意细节,尤其是特殊场景下的行为。
一、基本用法
1. getchar:读取单个字符
- 功能:从标准输入(通常是键盘)读取一个字符(包括空格、换行符等空白字符)。
- 返回值:成功时返回该字符的 ASCII 码(
int类型);遇到文件结束(EOF)时返回EOF(通常定义为-1)。 - 注意:必须用
int类型接收返回值(而非char),否则无法区分正常字符和 EOF。
2. putchar:输出单个字符
- 功能:向标准输出(通常是屏幕)输出一个字符。
- 参数:需输出字符的 ASCII 码(
int类型,实际只使用低 8 位)。 - 返回值:成功时返回输出的字符(
int类型);失败时返回EOF。
二、基础示例
cpp
运行
#include <cstdio>
int main() {
// 读取一个字符(用int接收,避免EOF判断错误)
int c = getchar();
if (c != EOF) {
// 输出读取到的字符
putchar(c);
}
return 0;
}
- 输入:若用户输入
'a'并回车,getchar会读取'a'(ASCII 码 97),putchar输出'a'。
三、特殊情况案例
1. 处理文件结束(EOF)
getchar在读取到文件结束时返回EOF(如 Linux 下按Ctrl+D,Windows 下按Ctrl+Z)。需用int变量判断,避免char类型的截断问题。
cpp
运行
#include <cstdio>
int main() {
int c;
// 循环读取直到EOF
while ((c = getchar()) != EOF) {
putchar(c); // 原样输出输入内容
}
return 0;
}
- 效果:输入任意内容(如
hello)并回车,会原样输出;按Ctrl+D(或Ctrl+Z)终止程序。
2. 缓冲区与换行符问题
标准输入是行缓冲的:用户输入的字符会先存到缓冲区,直到按下回车(\n)才会被getchar读取。因此getchar会读取包括\n在内的所有字符。
cpp
运行
#include <cstdio>
int main() {
int c1 = getchar(); // 读取第一个字符
int c2 = getchar(); // 读取第二个字符(可能是换行符)
printf("c1: %c, c2: %c\n", c1, c2);
return 0;
}
- 输入:若用户输入
a并回车,缓冲区内容为'a'和'\n'。输出:c1: a, c2:(c2是换行符,会导致输出换行)。
3. 与cin混用的冲突
C++ 的cin和getchar共享输入缓冲区,若cin读取后缓冲区残留字符(如换行符),getchar会直接读取残留内容,而非等待新输入。
cpp
运行
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int x;
cin >> x; // 输入"5"并回车,缓冲区残留'\n'
int c = getchar(); // 直接读取残留的'\n',而非等待新输入
putchar(c); // 输出换行
return 0;
}
- 解决:用
cin.ignore()清空缓冲区残留的换行符:cpp
运行
cin >> x; cin.ignore(); // 忽略缓冲区中的'\n' int c = getchar(); // 此时会等待新输入
4. 多字节字符的问题
getchar一次只能读取 1 个字节,若处理多字节编码(如 UTF-8 中文),会读取单个字节而非完整字符,可能导致乱码。
cpp
运行
#include <cstdio>
int main() {
// 假设输入UTF-8编码的中文"中"(3个字节:0xE4 0xB8 0xAD)
int b1 = getchar(); // 读取0xE4
int b2 = getchar(); // 读取0xB8
int b3 = getchar(); // 读取0xAD
putchar(b1); putchar(b2); putchar(b3); // 输出完整的"中"
putchar(b1); // 单独输出0xE4,显示乱码
return 0;
}
- 结论:
getchar不适合直接处理多字节字符,需配合编码解析逻辑。
5. 错误使用char接收返回值
若用char接收getchar的返回值,可能无法正确判断 EOF(因char可能为无符号类型,EOF的-1会被转换为0xFF,与某些字符冲突)。
cpp
运行
#include <cstdio>
int main() {
char c; // 错误:用char接收
while ((c = getchar()) != EOF) { // 循环可能无法终止(因c永远不等于EOF)
putchar(c);
}
return 0;
}
- 正确做法:始终用
int接收getchar的返回值。
总结
getchar和putchar用于单个字符的输入 / 输出,依赖<cstdio>。- 核心注意点:用
int接收getchar返回值以处理 EOF;注意缓冲区残留字符(尤其是换行符);避免与cin混用导致的冲突;不适合直接处理多字节字符。
编辑分享
在使用getchar和putchar时需要注意哪些细节?
除了getchar和putchar,C++中还有哪些类似的输入输出函数?
如何使用getchar和putchar实现字符串的输入输出?
13万+

被折叠的 条评论
为什么被折叠?



