繁体   English   中英

使用scanf填写多维数组(C语言)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM