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

数组元素移位输出异常求助:为何需用i+1而非i?

数组移位异常问题解析

问题描述

我有一个数组arr[],先获取输入。当输入为9999时,需要将这些数字置为0并向右移位1个索引,同时将索引0设为'1'。

原问题代码

if(carry == 1){
    arr[len]='0';
    for(i=len;i>0;i--){
        arr[i] = arr[i-1]; // arr[i+1] = arr[i] 可正常运行
    }
    arr[0]='1';
}

遇到的问题

输入9999时,输出结果为10000m、10000k或10000o这类带乱码的异常值。将arr[i] = arr[i-1];改为arr[i+1] = arr[i]后运行正常,但数组长度比最后一个字符的索引大1,为何必须用i+1而非i?


问题原因与解答

1. 数组索引的基本规则

先明确:数组长度n对应的合法索引范围是0到n-1——也就是你说的“数组长度比最后一个字符的索引大1”。比如存储输入9999的数组,若长度为4,合法索引是0~3;要存结果10000,数组长度至少得是5,合法索引0~4。

2. 原代码的逻辑错误

你要实现的是所有元素向右移位一位,再在开头插入'1',原代码的赋值方向完全搞反了:

  • 原循环for(i=len;i>0;i--)执行arr[i] = arr[i-1],是把前一位的值覆盖当前位,相当于元素向左移,而不是向右移。
  • 若len是原数组最后一个元素的索引(比如3),执行后会把arr[2]的9覆盖arr[3],arr[1]的9覆盖arr[2]……最终数组变成['1','9','9','9'],加上你提前设的arr[len]='0'(若len=4则是数组的第5位),此时数组末尾如果没有字符串终止符'\0',输出时会读取内存中数组后面的随机垃圾数据,也就是你看到的m/k/o这类乱码。

3. 为什么arr[i+1] = arr[i]能正常运行

改成arr[i+1] = arr[i]后,赋值方向变成把当前位的值移到后一位,这才是正确的右移逻辑:

  • 假设循环从原数组最后一个有效索引(比如3)开始向前遍历,执行arr[4] = arr[3]、arr[3] = arr[2]……就能把原数组的所有元素依次向右挪一位,空出arr[0]的位置。
  • 此时再把arr[0]设为'1',就能得到正确的10000;只要数组长度足够(能容纳5位字符加终止符),就不会出现越界读取乱码的问题。

内容的提问来源于stack exchange,提问作者ashutosh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:53:10