You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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快捷键映射,才会出现快捷键按了没反应的情况,按以下步骤配置即可:

  1. 打开CLion设置面板,依次进入Build, Execution, Deployment > Console配置页
  2. 勾选Use Ctrl+D/Ctrl+Z to send EOF选项,保存设置
  3. 终止当前正在运行的程序,重新启动运行/调试会话,之后对应快捷键就可以正常触发EOF终止循环。

如果不想修改IDE配置,也可以直接在系统终端运行编译生成的可执行文件,不受IDE内置控制台的配置限制。

内容的提问来源于stack exchange,提问作者TaxFrog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:54:22