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