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

C语言实现数组元素右移出现数值乱码问题求排查解答

数组右移乱码问题排查

核心错误点

  • 数组越界访问:内层循环条件写为i < limit时,当i取到limit-1,代码会访问arr[i+1]也就是arr[limit],这个位置不在你存入有效数据的下标范围内(有效下标为0~limit-1),读取的是栈上未初始化的垃圾值,这就是输出乱码的直接原因。
  • 移动逻辑完全错误:你当前内层循环的交换逻辑是实现整体左移一位的效果,和你要的右移需求完全相反;同时外层循环次数写为limit-tranfer,和右移需要的循环次数不匹配。
  • 思路误区:你注释里提到的给数组加\0是C语言字符串的结束规则,int类型数组不需要这个标记,强行加反而会引入多余的0值,逻辑错误。

修正后可运行代码

#include <stdio.h>
#define N 10
int main(void) {
    int limit, tranfer, arr[N];
    int i;
    scanf_s("%d %d", &limit, &tranfer);
    // 容错处理:移动位数超过数组长度时,取模等价为有效移动位数
    tranfer = tranfer % limit;
    for (i = 0; i < limit; i++) {
        scanf_s("%d", &arr[i]);
    }

    int j, temp;
    // 外层循环:总共右移tranfer次,每次移动1位
    for (j = 0; j < tranfer; j++) {
        // 提前保存当前最后一位的有效值,避免覆盖丢失
        temp = arr[limit - 1];
        // 从倒数第二位开始向前遍历,所有元素向后挪一位
        for (i = limit - 2; i >= 0; i--) {
            arr[i + 1] = arr[i];
        }
        // 把保存的最后一位放到数组首位,完成一次右移
        arr[0] = temp;
    }

    for (i = 0; i < limit; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

修改说明

  • 彻底解决越界问题:内层循环遍历范围控制在0~limit-2,不会访问超出有效范围的内存,从根源消除乱码
  • 调整移动逻辑:从后往前遍历赋值,实现正确的单次右移效果,避免元素覆盖丢失
  • 匹配循环次数:外层循环次数和实际需要右移的位数一致,增加取模容错,兼容移动位数大于数组长度的输入场景
  • 移除错误的字符串结束标记思路:int数组只要遍历输出有效下标范围的元素即可,不需要额外添加结束符

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:36:15