C语言读取0结尾数字序列输出最后5个数的代码问题排查
C语言程序无输出问题修复
问题根因
程序运行后无任何输出,是4处逻辑错误共同导致的:
- 结束标识匹配错误:代码中使用
if (j == '0')判断输入结束,这里的'0'是ASCII字符常量,对应整数值48,和用户输入的结束标识数字0完全不相等,判断永远不成立,循环无法正常退出。 - 循环终止条件设计错误:外层循环以
last_input < N作为执行条件,虽然环形覆盖写入的逻辑能让last_input在0到N-1之间循环,但因为永远匹配不到结束符,程序会一直阻塞在scanf位置等待更多输入,根本执行不到后续的打印代码。 - 退出分支破坏位置标记:原代码在判断到输入为0时,手动将
last_input赋值为N,会破坏环形缓冲区记录的最新写入位置,即使修正0的判断,最终打印的数字顺序也会出错。 - 打印起始位置偏移错误:原代码第一个打印循环从
last_input+1位置开始读取,会跳过1个需要输出的有效数字。
修复后完整代码
#include <stdio.h> #define N 5 int main() { int arr[N] = {0}; int last_input, j; printf("please enter more than %d number and then enter 0: \n", N); last_input = 0; // 无条件循环读取输入,读到结束符0再退出 while (1) { scanf(" %d", &j); // 匹配整数0作为结束标识 if (j == 0) { break; } // 环形写入数组,新值覆盖最旧的值 arr[last_input] = j; if (last_input == (N-1)) { last_input = -1; } ++last_input; } printf("The last %d numbers u entered are:\n", N); // 从当前写入位置开始,先输出数组后半段的旧值 for (j = last_input; j < N; ++j) { printf(" %d", arr[j]); } // 再输出数组前半段的新值 for (j = 0; j < last_input; ++j) { printf(" %d", arr[j]); } return 0; }
验证结果
使用测试输入1 6 9 5 2 1 4 3 0运行修复后的代码,会正确输出最后5个有效数字:
The last 5 numbers u entered are: 5 2 1 4 3
内容的提问来源于stack exchange,提问作者Alfa Hores
相关产品推荐
相关产品推荐

