《C程序设计语言》习题1.06疑问:输入Ctrl-D为何输出0D而非0?
输入Ctrl-D输出"0D"而非"0"的原因分析
代码逻辑回顾
你的代码逻辑明确:
#include <stdio.h> main() { printf("%d\n", getchar() != EOF); }
当getchar()读取到EOF时,getchar() != EOF的结果为0,程序会输出0并紧跟一个换行符(\n)。
为什么会显示"0D"?
问题出在M1 Mac终端的回显行为上:
- 在BSD系终端(M1 Mac默认终端基于此)中,
Ctrl-D的作用分两种场景:- 若输入缓冲区为空,
Ctrl-D向程序发送EOF; - 若缓冲区有内容,
Ctrl-D仅将缓冲区内容提交给程序,不发送EOF。
- 若输入缓冲区为空,
- 若你的终端关闭了
echoctl设置(该设置用于将控制字符显示为^X格式,比如Ctrl-D显示为^D),按下Ctrl-D时终端会直接回显字符D,而非^D。 - 当你在空缓冲区按下
Ctrl-D,程序输出0\n,但终端同时回显了D,二者在屏幕上叠加显示成0D——实际上程序只输出了0和换行,D是终端对Ctrl-D的回显内容。
验证与解决方法
- 执行终端命令开启
echoctl:
之后再运行程序并按下stty echoctlCtrl-D,终端会显示^D而非D,你就能清晰看到程序输出的0和换行。 - 确保按下
Ctrl-D前输入缓冲区为空(即没有输入任何字符),避免Ctrl-D被当作缓冲区提交信号而非EOF。
内容的提问来源于stack exchange,提问作者JackSea
相关产品推荐
相关产品推荐

