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

N*N矩阵按K次列右移旋转时出现段错误的问题排查求助

问题排查与修复

我帮你找出了导致段错误和逻辑异常的几个关键问题,咱们一步步拆解来看:

1. 未初始化变量触发数组越界(段错误根源)

你在最外层的旋转循环第一行写了 temp=arr[i][0];,但这里的i是在main开头声明的未赋值变量(此时i是随机的垃圾值),直接用它访问数组arr[i][0]必然会触发数组越界,导致段错误。

另外,结尾的arr[i][j]=temp;里的i和j也是循环外的未正确赋值变量,进一步加剧了越界问题。

2. 行右移的逻辑错误

你想要实现每一行向右移动1位(循环K次),但当前的循环逻辑完全不对:

  • 内层j的循环范围j=1;j<n-1;j++会漏掉最后一个元素的移动,正确的做法应该是从后往前覆盖(避免数据丢失),范围设为j=n-1;j>0;j--。
  • 向右移动时,应该保存当前行的最后一个元素(不是第一个),因为右移后最后一个元素会被移到第一个位置。

3. 冗余的旋转操作

如果K大于矩阵边长n(比如n=3,k=5),其实和k=2的效果完全一致(每n次旋转就回到原状态),所以可以先对k取模:k = k % n;,避免做无意义的重复循环。

4. 输出格式不符合预期

你预期的输出是数字用空格分隔,但你的printf("%d",arr[i][j]);没有添加空格,导致输出会连在一起,不符合要求。


修正后的代码

#include <stdio.h>
int main() {
    int n, i, j, k, temp;
    scanf("%d", &n);
    int arr[n][n];
    
    // 读取矩阵数据
    for(i = 0; i < n; i++){
        for(j = 0; j < n; j++){
            scanf("%d", &arr[i][j]);
        }
    }
    
    scanf("%d", &k);
    // 优化k值,减少冗余旋转
    k = k % n;
    
    // 执行k次右旋转
    for(int l = 0; l < k; l++){
        // 逐行处理右移
        for(i = 0; i < n; i++){
            // 保存当前行的最后一个元素
            temp = arr[i][n-1];
            // 从后往前覆盖元素
            for(j = n-1; j > 0; j--){
                arr[i][j] = arr[i][j-1];
            }
            // 将最后一个元素放到行首
            arr[i][0] = temp;
        }
    }
    
    // 按要求输出矩阵(空格分隔)
    for(i = 0; i < n; i++){
        for(j = 0; j < n; j++){
            printf("%d ", arr[i][j]);
        }
        // 每行结束换行(可选,按需调整)
        printf("\n");
    }
    return 0;
}

测试验证

用你给出的例子测试:

  • 输入n=3,k=2
  • 输入矩阵:10 20 30 40 50 60 70 80 90
  • 最终输出:
    20 30 10 
    50 60 40 
    80 90 70 
    

完全符合你的预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:02:50