C 如何仅使用一个函数扫描任何2d阵列?

C 如何仅使用一个函数扫描任何2d阵列?,c,arrays,function,parameters,size,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

我一直在寻找如何做到这一点,但我找不到任何东西,我想我可能问了一个错误的问题,但在这里,我一直试图使用一个函数来读取或打印您在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);

}
intmain(){
int array2d[2][5]={{0};
加载_阵列(array2d,2);
返回(0);
}
无效加载_数组(int a[][5],int行){
int i=0,j=0,列;
列=sizeof(*a)/sizeof(int);
做{
j=0;
而(j
通过在函数中计算列数,我成功地避免了传递列数,所以问题是我能做些什么?这并不复杂,可以避免传递行数,在本例中为2,这样我就可以在任何时候扫描在其他项目上创建的2d数组时使用此函数


谢谢你的帮助

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

因此,只需在每个“列”上迭代,然后以与查找列数相同的方式查找该“列”的“高度”


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

当您将数组作为参数传递给函数时,它“忘记”了它的大小;也就是说,它是从,比如说
char array[4][4]
转换为
char*array
,或者指向
int
的指针,因为数组是“just”一个连续的内存块

为了方便起见,可以指定最后一个标注的大小,但在其他方面没有意义

如果要使函数采用任意大小的数组,可以将两个维度作为参数传递:

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);
        }
    }
}
void load_数组(int*a、int行、int列)
{
int i,j;
对于(i=0;i
如果您有权访问支持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);
}
这将使用
标题和其他C99功能,如在循环控件中声明变量。我将更改声明并适当调用。至少这样,您可以在加载数据时判断是否出错,而不必交叉手指祈祷


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

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

#包括
无效加载数组(int*a,int len){
int i=0,j=0,列;
对于(i=0;i
您是否正在使用支持C99或C11的编译器?(基本上,您的编译器是MSVC还是Turbo-C?如果是,与回答否相比,您遇到了一些问题。)我想它是C11,我怎么能检查它呢?:一种可能性:显示
gcc--version
的输出,不过如果您首先使用
gcc
,这不会是一个问题。如果您不知道使用Microsoft Visual Studio或Turbo-C,那么您很有可能是安全的。如果您不使用gcc,请确定您正在使用的平台和编译器,但您可能还可以。是的,我正在使用gnu gcc编译器的代码块:)当您使用code::blocks和gnu gcc时,应该可以。您可能需要指定命令行选项
-std=c99
-std=gnu99
(或指定11而不是99),但您的编译器基本上肯定会处理C99(可能也会处理C11)。如果您有GCC 5.1.0或更高版本,默认编译模式是(最后!)
-std=gnu11
(默认情况下支持C11)。但是如果我从参数中删除5,我会得到一个编译错误,所以我要做的是将其更改为(*a)[]不管怎样,它都会衰减为,但是行的数量会以任何方式丢失,如果我将参数保留为(*a)[],我得到一个错误:数组的使用无效,未指定边界。你应该首先按照@chuxYes清理你的代码,这也是我一直在想的,它会衰减为指向数组的指针,行数会丢失,不管怎样,只是我使用了一个代码,你可以通过一个函数获得任何数组的大小,所以你可以只需传递数组的名称,然后计算其在函数中的维数……否;
int**a
int(*a)[4]
。你不能将双指针与2D数组一起使用。你必须设置额外的指针集。哦,你是对的,我错放了一个额外的星号。修复后代码似乎可以工作。谢谢,谢谢,谢谢!这是我正在寻找的替代方案,我不想在函数参数上加数字,但这很完美!我可以直接使用它后面的变量。用类似这样的强制转换来重击编译器表明存在问题。如果要按照您的建议进行操作,只需将
&array2d[0][0]
传递给函数,该函数不需要强制转换,因为
array2d[0][0]
是一个
int
,因此它的地址是一个
int*
。您的建议是可行的,但它丢失了“形状”信息;您无法区分10x1、5x2、2x5或1x10数组。有时这无关紧要,但有时会。例如,如果输入函数期望一个数组具有适当的条目数,则会在一行矩阵上输入一行,就需要知道它的形状。
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;
}
#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);

}