C程序运行无输出且持续执行,求助排查故障
C程序无输出且持续运行,需手动终止的问题解决
问题详情
- 程序运行后无任何输出,一直处于运行状态,直到手动终止
- 已确认MinGW版本安装正确、环境变量路径配置无误
- 仅包含
printf的简单测试代码可正常运行,但当前代码无法输出;该代码在Code::Blocks中可正常执行 - 多次重装MinGW、查阅教程仍未解决
原代码
#include <stdio.h> #include <stdlib.h> int leNumeroInteiro(); void leDadosRetangulo(int *comp, int *larg); void areaRetangulo(int comp, int larg); void limparBufferStdin(); int main() { int comp, larg; leDadosRetangulo(&comp, &larg); areaRetangulo(comp, larg); return 0; } void limparBufferStdin() { int c; while ((c = getchar()) != '\n' && c != EOF); } int leNumeroInteiro() { int num; do { scanf("%d", &num); limparBufferStdin(); } while (!(num > 0)); return num; } void leDadosRetangulo(int *comp, int *larg) { printf("=====================\n"); printf("\nIntroduza o comprimento do retangulo: "); *comp = leNumeroInteiro(); printf("\nIntroduza a largura do retangulo: "); *larg = leNumeroInteiro(); printf("=====================\n"); } void areaRetangulo(int comp, int larg) { float area; area = (float)comp * larg; printf("=====================\n"); printf("A area desse retangulo e: %.2f\n", area); }
问题原因
- 输出缓冲区未刷新:MinGW终端默认行缓冲模式,部分场景下
printf的输出会被暂存到缓冲区,无法立刻显示输入提示,导致误以为程序卡住。 - 缓冲区清理函数阻塞:
limparBufferStdin()中的getchar()会持续等待输入,若scanf读取整数后输入流中无剩余字符(比如回车未被正确识别),该函数会一直阻塞,导致程序停住。
解决方案
方案1:强制刷新输出缓冲区
在每个printf语句后添加fflush(stdout);,确保提示信息立刻显示:
void leDadosRetangulo(int *comp, int *larg) { printf("=====================\n"); fflush(stdout); printf("\nIntroduza o comprimento do retangulo: "); fflush(stdout); *comp = leNumeroInteiro(); printf("\nIntroduza a largura do retangulo: "); fflush(stdout); *larg = leNumeroInteiro(); printf("=====================\n"); fflush(stdout); }
方案2:优化缓冲区清理函数
修改limparBufferStdin(),避免无字符时阻塞:
void limparBufferStdin() { // 用scanf方式更稳妥,避免getchar阻塞 scanf("%*[^\n]"); // 跳过所有非换行符 scanf("%*c"); // 跳过换行符 }
方案3:组合优化
将两种方案结合,既刷新输出缓冲区,又优化清理函数,确保程序流程顺畅。
内容的提问来源于stack exchange,提问作者Vasco Vicente
相关产品推荐
相关产品推荐

