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

Mac系统下C语言程序运行异常,输入字符后while循环重复执行两次

代码存在的两个问题

1. 变量未初始化触发未定义行为

你声明的int c没有赋值初始值,第一次执行while(c != EOF)判断时,c的取值是栈内存的随机垃圾值,程序运行逻辑不可控,极端情况下会直接跳过循环输出FIN后退出。

2. 终端行缓冲机制导致换行符被误读

这是循环连续执行两次的核心原因:
终端默认采用行缓冲模式,只有按下回车键后,输入的内容才会被送入程序的输入缓冲区。你输入单个字符a后按回车,实际送入缓冲区的是两个字符:'a' + 换行符'\n':

  • 第一次循环:getchar()读取'a',正常输出对应内容,本轮循环结束
  • 第二次进入循环时,输入缓冲区中还有未被读取的'\n',getchar()不会阻塞等待键盘输入,直接读取'\n'返回,你看到的空Character输出行实际就是打印了这个换行符,因此出现循环不需要等待输入就连续执行两次的现象。

修复示例代码

#include <stdio.h>

int main(){
    int c, tmp;
    while(1){
        printf("Enter character\n");
        c = getchar();
        // 读到EOF直接退出循环
        if(c == EOF) break;
        // 跳过换行符不处理
        if(c == '\n') continue;
        printf("Character: %c\n", c);
        // 清空当前输入行剩余的所有字符,避免输入多字符时连续触发处理逻辑
        while((tmp = getchar()) != '\n' && tmp != EOF);
    }
    printf("FIN\n");
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 21:06:07