【问题标题】:Saving All non-zero terms from a 2D array into another 1D array将二维数组中的所有非零项保存到另一个一维数组中
【发布时间】:2015-04-21 16:22:42
【问题描述】:

A 是一个二维数组,我想将它的所有非零项存储在一个名为B 的新一维数组中...这是我调用的一个函数,但它会使程序崩溃,我不知道我做错了什么?

int doSomething(int A[N][N], int B[ ], int C[ ]){

    int i,j;
    int k=0;
    for(i=0; i<N; i++){
        for(j=0; j<N; j++){
            if (A[i][j] != 0){
                B[k]= A[i][j];
                k++;
            }
        }
    }
    for (i = 0; i < 4; i++) {
        printf("%d ", B[i]);
    }
}

【问题讨论】:

  • 你怎么知道i&lt; 4是有效的条件检查?试试i&lt; k
  • B[] 必须有 N*N 元素而不是 4。所以int B[N*N].
  • i &lt; 4 应该是i &lt; k
  • 很明显该函数崩溃了:它的名字不好。
  • @DrKroch 它可能是 do hit 的缩写

标签: c arrays function


【解决方案1】:

问题是for(i = 0; i &lt; 4; i++) 中的4B 数组的长度可能小于 4,因此会导致错误。因为您正在访问超出范围的索引。所以你应该改用for (i = 0; i &lt; k; i++)

【讨论】:

    【解决方案2】:

    有两个问题。

    首先正如@hamed 所说,'i' 应该小于 'k' 而不是小于 '4'

    其次,您假设它是一个正方形数组,但情况可能并非如此(行和列的长度相同)

    int doSomething (int A[r][c], int B[ ]){
    
        int k=0;
        for(; r>0; r--){
            for(; c>0; c--){
                if (A[i][j] != 0){
                    B[k]= A[i][j];
                    k++;
                }
            }
        }
        for (i = k-1; i >= 0; i--) {
            printf("%d ", B[i]);
        }
    return B;
    }
    

    注意:为了提高效率,在这种情况下最好向后执行循环,您忘记返回 B,而 C(据我所知)是不必要的

    【讨论】:

    • 谢谢,但我忘了提到 A 是一个方阵,在这个例子中它也恰好是一个 4x4 矩阵,因此为什么我在我的代码中写了 I
    • k,你确定不是因为你没有返回B
    • 是的,我也试过了.. 甚至将其转换为 void.. 什么都没有
    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2022-12-07
    • 2012-11-13
    • 2022-01-18
    • 1970-01-01
    • 2018-04-22
    • 2021-06-04
    相关资源
    最近更新 更多