C语言代码无法自动终止,需按Ctrl+Z结束执行的原因
问题根源与修复方案
你的程序能正确逆序输出被字母分隔的数字,但无法自动终止的核心原因是错误使用了scanf的返回值判断条件,同时缺少对输入结束(EOF)的处理逻辑。
关键问题点
scanf返回值判断错误:scanf读取成功时返回匹配的参数个数,读取失败(比如遇到非数字、输入结束)时返回EOF(值为-1),而非0。原代码用!= 0作为循环条件,导致输入结束后程序仍会持续尝试读取整数,陷入阻塞。- 未处理输入结束时的剩余数字:当输入最后一组数字后没有后续字符串(比如输入
1 2 3直接结束),程序不会输出这组逆序数字,且会一直阻塞。 - 嵌套循环冗余+数组越界风险:嵌套的
while(scanf("%d") !=0)逻辑重复,且未在每次读取时检查size是否超过MAX_NUM,存在数组越界风险。
修复后的代码
#include <stdio.h> #include <stdlib.h> #define MAX_NUM 64 int main() { int num[MAX_NUM]; int size = 0, i; char word[20]; int scan_ret; while (1) { // 读取数字,直到遇到非数字或输入结束 while ((scan_ret = scanf("%d", &num[size])) == 1) { if (size >= MAX_NUM - 1) { // 防止数组越界,留冗余位 break; } size++; } // 如果读取到数字,先输出逆序结果 if (size > 0) { for (i = size - 1; i >= 0; i--) { if (i == 0) printf("%d", num[i]); else printf("%d ", num[i]); } printf("\n"); size = 0; } // 处理输入结束的情况 if (scan_ret == EOF) { break; } // 读取分隔用的字符串,跳过非数字内容 if (scanf("%s", word) == EOF) { break; } } return 0; }
修复说明
- 正确判断
scanf返回值:用scan_ret == 1判断数字读取成功,scan_ret == EOF判断输入结束。 - 提前处理剩余数字:每次读完数字后,只要
size>0就输出逆序结果,避免输入结束时遗漏最后一组数字。 - 增加数组越界检查:每次读取数字前判断
size是否接近MAX_NUM,防止数组溢出。 - 简化循环逻辑:去掉冗余的嵌套循环,用单层循环处理数字读取,逻辑更清晰。
测试时,无论是终端输入1 2 3 hello 4 5 6 end后按回车,还是通过TXT文件传入输入,程序都会自动输出结果并终止,无需手动按Ctrl+Z。
内容的提问来源于stack exchange,提问作者Lucas Rus Gallego
相关产品推荐
相关产品推荐

