所以我有这个例子:
3 4 6 11 4 6 38 7 6 9
我需要从用户那里获得多个数字并创建多维array
。
第一个号码N
(我的示例中为3
)表示我的array
(或matrix
)将包含N²
值并插入所有这些数字(接下来的9个值)到我的array
。
首先我需要根据我的第一个值(在我的示例中为3
)定义数组并创建我的数组:
int a[3][3];
这里的问题是我需要在一行中获取所有输入,所以我不能使用它:
int marks[3];
int i;
for(i=0;i<3;i++)
{
printf("Enter a no\n");
scanf("%d",(marks+i));
}
答案 0 :(得分:0)
scanf从stdin中读取数据,并根据参数格式将它们存储到附加参数指向的位置。
scanf
将存储来自stdin的整个输入,因此它是否在单行中并不重要。代码的方式就是,只需向用户询问尺寸并创建给定尺寸的变量,并用scanf填充每个值。
有三种方法可以做到:
如果您的编译器支持可变长度数组:
int size,i,j;
scanf("%d",&size);
int matrix[size][size];
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
scanf("%d",&matrix[i][j]);
}
}
不支持变长数组:(使用指针数组)
int size,i,j;
scanf("%d",&size);
int **matrix;
matrix = (int **)malloc(sizeof(int *) * size);
for(i=0;i<size;i++)
{
matrix[i] = (int *)malloc(sizeof(int) * size);
}
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
scanf("%d",&matrix[i][j]);
}
}
这看起来很简单,但方式非常差,因为它实际上不是2D数组而是指针数组。因此,如果您的编译器不支持可变长度数组,我建议使用第三种方法。
使用malloc :(带指针)
创建整数数组,如:
int size;
scanf("%d",&size);
int *matrix;
matrix = (int *) malloc( sizeof(int) * size * size );
现在,要填充或获取数组的值,您需要遍历特定值。
填写:
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
scanf("%d", (matrix + i*(size) + j));
}
}
迭代:(在这种情况下打印)
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
printf("%d " ,*(matrix+ i*size + j) );
}
printf("\n");
}
注意:限制输入并检查它是否位于某个固定范围内非常重要。例如:(0 <大小<100)。这很简单,你可以自己做。我只回答了重要的部分:)
答案 1 :(得分:-1)
首先,您不能在3x3矩阵中存储10个数字。在开始编程之前,请务必确保您的规范有意义。
输入是微不足道的,只需使用嵌套循环来控制读取输入在矩阵中的最终位置。具有固定数组大小的示例:
#include <stdio.h>
#include <stdlib.h>
#define x 3
#define y 3
int main (void)
{
int arr[x][y];
printf("Enter %d numbers: ", x*y);
for(size_t i=0; i<x; i++)
{
for(size_t j=0; j<y; j++)
{
scanf(" %d", &arr[i][j]);
}
}
for(size_t i=0; i<x; i++)
{
for(size_t j=0; j<y; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
(注意,这会在stdin中留下很多像换行字符一样的垃圾。还没有缓冲区溢出保护。有关如何正确读取输入的示例,请参阅How to read / parse input in C? The FAQ。)
如果需要可变大小矩阵,可以使用可变长度数组(VLA):
size_t x = 3; // some run-time value
size_t y = 3; // some run-time value
int arr[x][y];
... // then same code as above
或者,您可以使用动态分配的2D数组:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
size_t x = 3;
size_t y = 3;
int (*arr)[y] = malloc( sizeof(int[x][y]) );
printf("Enter %zu numbers: ", x*y);
for(size_t i=0; i<x; i++)
{
for(size_t j=0; j<y; j++)
{
scanf(" %d", &arr[i][j]);
}
}
for(size_t i=0; i<x; i++)
{
for(size_t j=0; j<y; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
free(arr);
return 0;
}
或者,如果您的编译器来自侏罗纪时期,您可以使用旧式“受损”2D阵列:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
size_t x = 3;
size_t y = 3;
int* mangled = malloc(x * y * sizeof *mangled);
printf("Enter %zu numbers: ", x*y);
for(size_t i=0; i<x; i++)
{
for(size_t j=0; j<y; j++)
{
scanf(" %d", &mangled[i*x + j]);
}
}
for(size_t i=0; i<x; i++)
{
for(size_t j=0; j<y; j++)
{
printf("%d ", mangled[i*x + j]);
}
printf("\n");
}
free(mangled);
return 0;
}
以上4种替代方案是唯一的替代方案。你不应该使用“指向指针查找表”,这里绝对不需要它们。不幸的是,很多坏书和坏老师都在传播这种技巧。请参阅Correctly allocating multi-dimensional arrays。
答案 2 :(得分:-3)
试试这个:
int** InitMatrix()
{
int** matrix = NULL;
int n;
if (scanf("%d", &n) > 0 && n > 0)
{
matrix = malloc(n * sizeof(int*));
for (int i = 0; i < n; i++)
{
matrix[i] = malloc(n * sizeof(int));
for (int j = 0; j < n; j++)
{
if (scanf("%d", &matrix[i][j]) == 0)
{
// user input error; decide what to do here
}
}
}
}
else
{
// user input error; decide what to do here
}
return matrix;
}