C++中getchar与putchar使用详解

在 C++ 中,getcharputchar是从 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++ 的cingetchar共享输入缓冲区,若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的返回值。

总结

  • getcharputchar用于单个字符的输入 / 输出,依赖<cstdio>
  • 核心注意点:用int接收getchar返回值以处理 EOF;注意缓冲区残留字符(尤其是换行符);避免与cin混用导致的冲突;不适合直接处理多字节字符。

编辑分享

在使用getchar和putchar时需要注意哪些细节?

除了getchar和putchar,C++中还有哪些类似的输入输出函数?

如何使用getchar和putchar实现字符串的输入输出?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值