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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:33:32