K&R C习题1-8:while((c=getchar())!=EOF)循环按回车不终止
《C程序设计语言》(克尼汉、里奇著)习题1-8问题解决
问题代码
void countBlanksTabsNewlines() { int c, newLines, tabs, blanks; newLines = 0; tabs = 0; blanks = 0; while ((c = getchar()) != EOF){ if (c == '\n'){ ++newLines; } else if(c == '\t'){ ++tabs; } else if(c == ' '){ ++blanks; } } printf("New Lines = %d , Tabs = %d , Blanks == %d", newLines, tabs, blanks); }
核心原因
按回车无法终止循环是对终止条件的认知偏差导致的,代码本身的计数逻辑没有错误:
- 按下回车键只会向输入缓冲区写入换行符
'\n',仅会触发代码里的换行计数逻辑,完全不满足getchar() == EOF的循环退出条件。 - EOF是文件结束标识,不是可以通过键盘直接输入的普通可见字符,必须通过对应快捷键向运行环境发送专属信号才能触发,因此按回车永远不会终止循环。
各环境EOF触发方式
- 在线编译器、Linux/macOS 系统终端:输入状态下按
Ctrl+D即可发送EOF信号,终止输入循环 - Windows 原生cmd/PowerShell终端:输入状态下按
Ctrl+Z后再按一次回车,即可发送EOF信号
CLion环境快捷键无效解决方案
CLion内置控制台默认关闭了EOF快捷键映射,才会出现快捷键按了没反应的情况,按以下步骤配置即可:
- 打开CLion设置面板,依次进入
Build, Execution, Deployment > Console配置页 - 勾选
Use Ctrl+D/Ctrl+Z to send EOF选项,保存设置 - 终止当前正在运行的程序,重新启动运行/调试会话,之后对应快捷键就可以正常触发EOF终止循环。
如果不想修改IDE配置,也可以直接在系统终端运行编译生成的可执行文件,不受IDE内置控制台的配置限制。
内容的提问来源于stack exchange,提问作者TaxFrog
相关产品推荐
相关产品推荐

