putchar 和 getchar 是 C 语言标准库 stdio 头文件提供的两个单字符输入输出函数,属于最基础的字符 IO 接口,getchar 负责从标准输入也就是键盘读取一个字符,putchar 负责向标准输出也就是屏幕打印一个字符,这两个函数返回值类型都是 int,并不是 char 类型,这是初学者最容易踩坑的关键点,设计成 int 是为了可以容纳 EOF 这个文件结束标记,也就是数值负一,当输入流结束的时候 getchar 会返回 EOF,putchar 接收一个 int 类型参数,把参数对应的 ASCII 字符输出,执行成功会返回输出的字符本身,失败返回 EOF,这一对函数经常搭配使用,用来实现单字符读取 回车判断 循环读入字符等基础逻辑,相比 scanf 和 printf,它们处理单个字符更加轻量,不需要格式控制符,在入门 C 语言刷题 字符处理 缓冲区练习当中使用频率非常高。
函数基础定义
getchar 函数原型 int getchar (void),没有传入参数,调用一次就等待用户输入,并且会等待回车才会把缓冲区里的字符送入程序,这就是有名的行缓冲机制,用户输入的字符会先存在输入缓冲区,按下回车之后缓冲区数据才会提交,剩下还留在缓冲区的字符,下一次调用 getchar 会直接读取,不会再次等待键盘输入。
putchar 函数原型 int putchar (int c),传入的 c 可以是字符常量也可以是字符变量或者 ASCII 码整数,函数会输出对应的字符。
核心参数与返回值对照表
| 函数 | 头文件 | 函数原型 | 核心功能 | 返回值说明 |
|---|---|---|---|---|
| getchar | stdio.h | int getchar(void) | 读取标准输入单个字符 | 成功返回字符的 ASCII 整数值,读到结束返回 EOF |
| putchar | stdio.h | int putchar(int c) | 输出单个字符到屏幕 | 成功返回输出字符,出错返回 EOF |
基础使用步骤
第一步 引入头文件 stdio.h,因为两个函数都声明在这个头文件里面,缺少头文件编译会报警告
第二步 定义 int 类型变量接收 getchar 的返回值,不要用 char 变量接收,避免 EOF 判断出错
第三步 调用 getchar 读取字符,执行读取操作
第四步 使用 putchar 把读取到的字符原样输出,完成读和写的配对
第五步 可以编写循环,持续调用 getchar 读取字符,直到读到 EOF 停止,实现批量字符处理
深度重点知识点
缓冲区残留问题是这两个函数最大难点,比如上一次 scanf 读取数字之后,回车换行符还留在缓冲区,下一次 getchar 会直接读到这个换行符,程序表现为没有等待用户输入就自动执行,解决办法可以额外调用 getchar 消耗掉残留换行符。
EOF 在 Windows 控制台一般使用 ctrl 加 z 触发,Linux 系统使用 ctrl 加 d 触发,这个标记并不是普通字符,它是输入流结束信号。
putchar 可以输出转义字符,比如 putchar (n) 就可以实现换行,等同于 printf 的换行效果。
getchar 是阻塞函数,程序运行到 getchar 的时候会暂停,等待用户输入,没有输入的时候程序停在这里。
简单示例逻辑
定义 int ch
ch = getchar ()
putchar (ch)
这段代码运行之后,用户敲击一个字符按下回车,屏幕就会把这个字符打印出来。
【常见问题】
问题 1 putchar 和 getchar 的用法里面为什么推荐用 int 变量接收 getchar 返回值
回答 1 putchar 和 getchar 的用法当中,getchar 返回值是 int 类型,需要用 int 变量接收,因为要识别 EOF 这个负一标记,如果使用 char 类型存储,会和合法字符产生冲突,导致判断失效
问题 2 putchar 和 getchar 的用法里面输入缓冲区残留是什么问题
回答 2 putchar 和 getchar 的用法里,getchar 采用行缓冲,回车之后缓冲区多余字符会保留,下一次调用 getchar 会直接读取残留字符,不会等待键盘输入,这就是缓冲区残留问题
问题 3 putchar 和 getchar 的用法中 putchar 能不能直接输出 ASCII 数字对应的字符
回答 3 putchar 和 getchar 的用法中 putchar 支持传入 ASCII 整数,会自动转换成对应字符输出,这是 putchar 和 getchar 的用法里非常实用的特性
【免责申明】
本内容仅作为 C 语言入门学习参考,不同编译器对于函数行为细节可能存在微小差异,正式课程或者考试请以教材和编译器规范为准。


