C语言——putchar 与 getchar

一、核心功能

  • putchar 函数:相当于 "单个字符打印机",仅能输出 1 个字符(包括可见字符、换行符\n等控制字符)。
  • getchar 函数:相当于 "单个字符扫描仪",仅能读取 1 个字符(从键盘输入,包括回车、空格等)。

两者均属于 C 标准库<stdio.h>,是考研 408 真题中常考的基础 I/O 函数,重点考查返回值、缓冲机制和异常处理。

二、语法与用法

1. putchar 函数

  • 格式:int putchar(int ch);
  • 核心说明:参数ch:可以是字符常量(如'A')、字符变量(如char c='b'),或 ASCII 码值(如 97 对应'a')。
  • 返回值:++成功输出返回字符的 ASCII 码(int 型)++;失败返回 EOF(本质是 - 1)。
  • 考研常考示例:
cpp 复制代码
#include <stdio.h>
int main() {
    putchar('X');    // 输出:X
    putchar(10);     // 输出换行(10是'\n'的ASCII码)
    char c = 'Y';
    putchar(c);      // 输出:Y
    return 0;
}

2. getchar 函数

  • 格式:int getchar(void);
  • 核心说明:++无参数++,从键盘读取 1 个字符。
  • 返回值:++成功读取返回字符的 ASCII 码(int 型)++;读取结束(Ctrl+Z/Windows、Ctrl+D/Linux)或失败时返回 EOF。
  • 关键考点:返回值是 int 型(而非 char 型),因为 EOF(-1)无法用 unsigned char 存储(真题易错点!)。
  • 考研常考示例:
cpp 复制代码
#include <stdio.h>
int main() {
    int ch; // 必须用int接收,不能用char!
    printf("输入一个字符:");
    ch = getchar();  // 读取键盘输入的1个字符
    putchar(ch);     // 输出读取到的字符
    return 0;
}

三、考研核心考点与易错点

1. 缓冲机制(高频考点)

  • getchar 是 "行缓冲" 输入:输入后需按回车确认,回车符\n会存入缓冲区,下次调用 getchar 会优先读\n
  • 真题易错示例:
cpp 复制代码
// 问题:输入"A"并回车后,输出什么?
#include <stdio.h>
int main() {
    int ch1 = getchar();
    int ch2 = getchar();
    putchar(ch1);
    putchar(ch2);
    return 0;
}
  • 输出:A(换行)------ch1 读A,ch2 读缓冲区的\n
  • 解决方案:用getchar()吸收多余的\n,或清空缓冲区。

2. EOF 的应用(必考点)

  • EOF(End of File)表示输入结束,是循环读字符的常用条件。
  • 标准用法:
cpp 复制代码
#include <stdio.h>
int main() {
    int ch;
    // 循环读字符,直到Ctrl+Z/Ctrl+D结束
    while((ch = getchar()) != EOF) {
        putchar(ch); // 回显输入字符
    }
    return 0;
}

3. 常见误区

  • 误区 1:用char接收 getchar 返回值,无法正确判断 EOF。
  • 误区 2:认为 putchar 只能输出可见字符,忽略其可输出\n\t等控制字符。

四、真题总结

  • 核心考点:返回值类型(int)、缓冲机制、EOF 判断、换行符处理。
  • 解题技巧:遇 getchar/putchar 题,先分析缓冲区内容,再检查返回值与 EOF 处理。
相关推荐
zoujiahui_201842 分钟前
使用venv命令创建和使用python环境
开发语言·python
姚华军1 小时前
利用Python算法,解析PDF文件并生成文档分块Chunks,追加到RagFlow知识库
开发语言·python·pdf·chunks·ragflow
geekmice1 小时前
Thymeleaf传递复杂对象参数解决思路
开发语言·lua
我超级能吃的1 小时前
线程池核心原理及使用
java·开发语言
郝学胜-神的一滴1 小时前
Effective Modern C++ 条款34:优先考虑lambda而非std::bind
开发语言·c++·程序人生
无敌最俊朗@1 小时前
C++ 内存管理与编译原理 (面试复习2)
java·开发语言·jvm
火山灿火山1 小时前
Qt信号和槽
开发语言·qt
这样の我1 小时前
java 模拟chrome tls指纹
java·开发语言·chrome
m0_661279181 小时前
学习笔记-安装并启动 Jupyter Noteboo
开发语言·python