簡體   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