c - 在 C 中应用左移

标签 c

<分区>

我正在学习如何在 C 中操作二维数组,我必须将左移应用于矩阵,因此 A[0][0] 成为 A[0][1] 等处的值。这是尝试几次后得到的代码和输出;我想我可能会接近:

void LeftShift2D(int A[M][N]){
int i;
int j;
int temp;
for(i = 0; i < M; i++){
    for(j = 0; j < N; j++){
        temp = A[0][0];
        A[i][j] = A[i+1][j+1];
    }
}
A[i][j] = temp;
}

将其作为输入:

14 17 28 26 24
26 17 13 10 2
3 8 21 20 24
17 1 7 23 17
12 9 28 10 3
21 3 14 8 26

这是期望的输出:

17 28 26 24 26
17 13 10 2 3
8 21 20 24 17
1 7 23 17 12
9 28 10 3 21
3 14 8 26 14

但这是我得到的实际输出:

14 17 28 26 24 
26 17 13 10 2 
3 8 21 20 24 
17 1 7 23 17 
12 9 28 10 3 
21 3 14 8 26 
4
17 13 10 2 3 
8 21 20 24 17 
1 7 23 17 12 
9 28 10 3 21 
3 14 8 26 4 
-1218716075 -1217196044 0 -1079502888 134514340 

怎么了?

最佳答案

到目前为止,做你想做的最简单的方法是:

void LeftShift2D(int A[M][N])
{
    int i;
    int temp = A[0][0];
    int *base = &A[0][0];
    for (i = 0; i < M * N - 1; i++)
        base[i] = base[i+1];
    A[i] = temp;
}

这会将数组视为一个 vector ,并将数据向下移动一个空格,将最初位于开头的值旋转到结尾。如果你想单独旋转每一行,你会使用不同的代码,与你显示的内容更密切相关:

void LeftShift2D(int A[M][N])
{
    int temp;
    for (int i = 0; i < M; i++)
    {
        int j;
        int temp = A[i][0]
        for (j = 0; j < N - 1; j++)
            A[i][j] = A[i][j+1];
        A[i][j] = temp;
    }
}

您的代码存在各种问题。 A[i][j] = A[i+1][j+1]; 赋值越界访问数据,并“沿对角线”复制数据,将单元格复制到右下角当前单元格的(或东南),而不是当前单元格右侧(东)的单元格。包装也有问题。

关于c - 在 C 中应用左移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28444376/

相关文章:

c - 使用 sscanf 返回值

C - 对数组描述进行排序

c -\r,\n,\b 在此程序中如何工作

main() 可以返回结构吗?

c - 哈希表 - 使用 qsort 排序结构

arrays - 为什么交换两个变量后无法读取一个变量

c - fwprintf 什么时候返回负数?

c - 动态创建的C字符串

c++ - 在C/C++中使用Sox录制

c - MACROS - 如何实现除法然后舍入