[英]Using scanf to fill out a multidimensional array (C language)
我想知道如何正确使用scanf来填充多维数组。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
int n; //number of rounds
int* sArray; //multidimensional array that holds the scores of both players
int i;
scanf("%d", &n);
sArray = (int*) calloc (n * 2, sizeof(int));
for(i=0; i<n; i++) {
scanf("%d %d", &sArray[i][1], &sArray[i][2]);
}
return 0;
}
它给了我一个错误,“下标值不是数组,指针或向量。” 任何帮助将非常感激!
二维数组定义如下: int sArray[N][M]
,但由于你想使用动态内存,我建议你看一下指向int
指针:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d", &n);
int **sArray;
sArray = (int **)malloc(n * sizeof(int *));
int i;
for(i = 0; i < n; i++)
{
sArray[i] = (int *)malloc(2 * sizeof(int));
scanf("%d %d", &sArray[i][1], &sArray[i][2]);
}
return 0;
}
完成阵列后,不要忘记清理。
正如评论中所提到的,如果使用pure c
,则不需要转换malloc
的结果。 我这样做是因为我的c ++编译器拒绝编译它而没有这个强制转换。
您可能需要在动态分配阵列期间检查错误。 在这里阅读更多
这里有很多关于如何定义动态2D数组的好答案。 但是这个变种还没有提到,所以我把它作为记录。
由于数组的最后一个维度是固定的,您可以按如下方式定义2D数组:
int (*sArray)[2]; //multidimensional array that holds the scores of both players
...
sArray = (int(*)[2]) calloc (n, sizeof(int)*2); // self explaining
这样,所有元素将被连续存储(分配的数组的每n个元素,是2个连续的整数),而不需要数组到数组。
其余代码保持不变。 除了你sArray[i][0]
地址sArray[i][0]
和..[1]
而不是[1]
和[2]
以及最后的空闲记忆。 在C数组中,索引始终从0开始,并转到size-1。
当然,这种方法严格限于2D阵列,其中最后一个维度是固定的。
通常要填充二维数组,您将使用两个嵌套的for循环。 例如 :
int array[2][3] = {0};
for (i = 0; i < 2; i++)
for (k = 0; k < 3; k++)
scanf("%d", &array [i][k]);
你也可以这样做:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
int n; //number of rounds
int** sArray = malloc(2 * sizeof(int*)); //multidimensional array that holds the scores of both players
scanf("%d", &n);
sArray[0] = (int*)calloc(n , sizeof(int));
sArray[1] = (int*)calloc(n , sizeof(int));
int i;
for (i = 0; i < n; i++) {
scanf("%d %d", &sArray[0][i], &sArray[1][i]);
}
free(sArray[0]);
free(sArray[1]);
free(sArray);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.