如何使用一个函数扫描ANY 2d数组?

时间:2015-08-17 23:36:54

标签: c arrays function parameters size

我一直在寻找如何在任何地方做到这一点,我找不到任何东西,我想我可能会问错误的问题,但在这里,我一直试图只使用一个函数来读取或打印你在main上定义的任何2d数组,然后将它作为单个参数传递给函数...这是我的代码:

int main() {

    int array2d[2][5] = {{0}};

    load_array(array2d,2);

    return(0);

}

void load_array(int a[][5],int row) {

    int i = 0,j = 0,column;
    column= sizeof(*a) / sizeof(int);

    do {
        j=0;
        while (j < column && scanf("%d",&a[i][j++]) == 1);
    } while (++i < row);

}

我已经设法避免必须通过在函数内部计算它来传递列数,所以问题实际上是我能做什么,这不是复杂的方法,以避免必须通过行的数字,2在这case,这样我可以随时使用这个函数来扫描我在其他项目上创建的二维数组吗?

感谢您的帮助!!

4 个答案:

答案 0 :(得分:0)

当您将数组作为参数传递给函数时,它会忘记&#34;忘记&#34;它的大小;也就是说,它从char array[4][4]转换为char *array或指向int,因为数组是&#34;只是&#34;一块连续的记忆。

您可以轻松指定最后一个维度的大小,但这样做毫无意义。

如果你想使一个函数采用任何大小的数组,你可以做的是将两个维度作为参数传递:

void load_array(int *a, int rows, int columns)
{
    int i, j;
    for (i = 0; i < rows; i++) {
        for (j = 0; j < columns; j++) {
            scanf("%d, a + i * columns + j);
        }
    }
}

答案 1 :(得分:0)

如果您可以访问支持C99或C11的编译器,您应该能够使用如下所示的代码来处理int的任何2D数组:

#include <stdio.h>

extern void load_array(int n, int m, int a[n][m]);

int main(void)
{
    int array2d_2_5[2][5] = { { 25 } };
    int array2d_9_4[9][4] = { { 94 } };

    load_array(2, 5, array2d_2_5);
    load_array(9, 4, array2d_9_4);

    return(0);
}

void load_array(int n, int m, int a[n][m])
{
    int i = 0, j = 0;
    column= sizeof(*a) / sizeof(int);

    do
    {
        j = 0;
        while (j < m && scanf("%d", &a[i][j++]) == 1)
            ;
    } while (++i < n);
}

我并不完全热衷于do … while循环,但我认为它可能有效。我很想使用load_array()的替代定义,更像是这样:

bool load_array(int n, int m, int a[n][m])
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (scanf("%d", &a[i][j++]) != 1)
                return false;
        }
    }
    return true;
}

这将使用<stdbool.h>标头和其他C99功能,如在循环控件中声明变量。我会改变声明并适当地打电话。至少在这种情况下,您可以判断在加载数据时是否出现了问题,而不是必须指责和希望。

问题是只使用一个函数来读取或打印任何2d数组;处理任何类型的任何2D数组都要困难得多。

答案 2 :(得分:0)

将总长度作为参数传递。请确保array2d存储在连续内存中(例如声明:int array2d [2] [5];)

#include <stdio.h>

void load_array(int *a,int len) {

    int i = 0,j = 0,column;

    for (i = 0; i < len; i++) {

        if( 1 != scanf("%d", a+i)) {
            break;
        }
    }
}

int main() {

    int array2d[2][5] = {{0}};

    load_array((int*)array2d, 2*5);

    return(0);

}

答案 3 :(得分:-1)

不要将它视为二维数组。它是一个数组数组,即[[],[],[],[]]

所以只需迭代每个“列”,然后找到该“列”的“高度”,就像找到列数一样。

(如果数组没有锯齿状,那么你可以找到一个“列”的“高度”,即sizeof(a [0])