在C中应用左移

时间:2015-02-11 00:19:23

标签: c

我正在学习如何在C中操纵2D数组,我必须将左移应用于矩阵,因此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 

怎么了?

2 个答案:

答案 0 :(得分:3)

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

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;
}

这会将数组视为向量,并将数据向下移动一个空格,将最初在开始时的值旋转到结尾。如果您想分别旋转每一行,您将使用不同的代码,与您显示的内容更为相关:

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];赋值访问数据超出范围,并“对角”复制数据,将单元格复制到当前单元格的右下角(或东南角),而不是右侧(东侧)的单元格。当前的细胞。它的包装也有问题。

答案 1 :(得分:1)

这里有缓冲区溢出

A[i][j] = A[i+1][j+1];

您需要迭代到i < M - 1j < N - 1

您正在访问无效内存,该内存解释了观察到的值,这也会调用未定义的行为,因此您最终可能会发现一些奇怪的行为。