如何使用用户输入值填充C中的2D数组?

时间:2011-11-21 11:31:18

标签: c arrays

注意:这是一个家庭作业问题。

  

使用FOR构造来使用给定的值填充2D板   用户。程序要求板尺寸为n,m然后它会询问每个    董事会价值。

我的尝试

#include <stdio.h>
int main(){
    printf("Enter the number of columns");
    int i = scanf("%d",&i);
    printf("Enter the number of rows");
    int y = scanf("%d",&y);

    int r[i][y];
    int a;
    int b;
    for (a=0; a<i; a++){
        for(b=0; b<y; b++){
            int r[a][b] = scanf("%d",&a,&b); //bug
        }
    }
}

Bug: c:13 variable-sized object may not be initialized

修改

#include <stdio.h>

int main(){

    printf("Enter the number of columns");
    int i; 
    scanf("%d", &i);
    printf("Enter the number of rows");
    int y; 
    scanf("%d", &y);

    int r[i][y];
    int a;
    int b;

        for (a=0; a<i; a++){
            for (b=0; b<y; b++){
    scanf("%d",&r[a][b]);
        }
    }
}

5 个答案:

答案 0 :(得分:7)

scanf获取正在读取的变量的地址,返回读取的项目数。它不会返回读取的值。

替换

int i = scanf("%d",&i);
int y = scanf("%d",&y);

通过

scanf("%d",&i);
scanf("%d",&y);

int r[a][b] = scanf("%d",&a,&b);

通过

scanf("%d",&r[a][b]);

修改

您在程序中使用variable length array (VLA)

int r[i][y];

因为iy不是常量而是变量。 VLA是C99标准功能。

答案 1 :(得分:2)

你必须动态分配2D数组,因为你在编译时不知道它的大小。

替换

int r[i][y];

int *r = malloc(i*y*sizeof(int));

完成后,添加:

free(r);

*以及SCANF错误,人们已在此处回答。

答案 2 :(得分:1)

首先,scanf的返回值不是从stdin读取的值,而是读取的输入值scanf的数量。

其次,C不允许使用变量创建数组。您必须首先通过动态分配它来创建一个数组。对于第一个数组中的每个条目,您必须创建另一个数组。

不要忘记释放你分配的记忆!

答案 3 :(得分:1)

scanf(%d, &var)的使用不正确  scanf 从控制台读取一个整数(此类型由其第一个参数%d指定)并将其存储在第二个参数中。
第二个参数必须是指针,因此当您的变量不是指针时需要&

因此,您应该以这种方式更正您的代码:

int i;    
scanf("%d",&i);

int y;
scanf("%d", &y);

并在您的for循环中

scanf("%d", &r[a][b]);

答案 4 :(得分:0)

由于行缓冲,它不会打印消息。

如果您在字符串中添加\n(开始新行),它可能会达到您的预期效果:

printf("Enter the number of columns\n");

或者,如果您确实希望用户在同一行上键入,则需要手动刷新缓冲区:

printf("Enter the number of columns");
fflush (stdout);