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
相关产品推荐
相关产品推荐

