[英]How do you fill a 2D array of structs in C?
在我的程序中,我創建了一個名為student
的struct
,它有兩個int
字段ID
和classNum
。 如果我制作一個包含20名學生的2D數組,我如何使用循環來遍歷數組並為每個學生分配其值? 為此,值按數字順序,1-20和30-50,所以我認為使用for循環應該很容易,但我不能讓它工作。 我基本上需要它在完成時返回指向數組的指針。
typedef struct student
{
int ID;
int classNum;
};
//Creates a 4x5 array of students
struct student classroom [4][5];
//Creates the function that will return the array
student **makeClass()
{
int classNumba = 30;
int x = 0;
for(x = 1; x <= 20; x++)
{
classroom[x].ID = x;
classroom[x].classNum = classNumba;
classNumba++;
}
return classroom;
}
您需要有2個循環而不是1,如下所示,
for(i = 0; i <4; i++)
{
for(j = 0; j <5; j++)
{
classroom[i][j].ID = (i+1) * (j+1);
classroom[i][j].classNum = classNumba;
classNumba++;
}
}
此外,由於classroom
是全球性的,您無需退回。
正如我從你的問題中看到的,你不知道如何初始化二維結構數組。 所以你應該參考這個 。 要填充2D數組,您總是需要2個循環,所以請記住這一點。
int i=1, classNumba=30;
for(x=0; x<4; x++) {
for(y = 0; y <5; y++) {
classroom[x][y].ID = i;
classroom[x][y].classNum = classNumba;
classNumba++;
i++;
}
}
循環將執行((x = 4)*(y = 5)= 20)表示20次。 20次i
將被分配到教室[x] [y] .ID,並且每次它將從其初始值i=1
增加+1。 類似地,classNumba將被分配到教室[x] [y] .classNum,並且每次它將從其初始值classNumba=30
增加+1
您的代碼存在許多微妙的問題,首先是 - 當一個簡單的數組更有意義時,為什么在世界上你想要一個2D數組結構? 無論如何,你可以自由地使用2D數組,但就問題陳述而言 - 絕對沒有必要這樣做。
使用簡單的1D數組可以極大地簡化代碼,以及在函數之間傳遞參數。 嘗試進行以下比較:
#include <stdio.h>
typedef struct student {
int ID;
int classNum;
} student;
#define NSTUD 20
student *makeClass (student *classroom);
int main (void) {
student classroom [NSTUD] = {{0}, {0}}; /* array of 20 students */
size_t i = 0;
makeClass (classroom);
printf ("\nclassroom information:\n\n");
for (i = 0; i < NSTUD; i++)
printf (" ID : %2d classNum : %2d\n",
classroom[i].ID, classroom[i].classNum);
return 0;
}
/* function that will return the array */
student *makeClass (student *classroom)
{
if (!classroom) return NULL; /* validate classroom address */
int classNumba = 30;
int x = 0;
for(x = 0; x < NSTUD; x++)
{
classroom[x].ID = x + 1;
classroom[x].classNum = classNumba;
classNumba++;
}
return classroom;
}
編譯(啟用警告)
gcc -Wall -Wextra -O3 -o bin/classroom classroom.c
使用/輸出
$ ./bin/classroom
classroom information:
ID : 1 classNum : 30
ID : 2 classNum : 31
ID : 3 classNum : 32
ID : 4 classNum : 33
ID : 5 classNum : 34
ID : 6 classNum : 35
ID : 7 classNum : 36
ID : 8 classNum : 37
ID : 9 classNum : 38
ID : 10 classNum : 39
ID : 11 classNum : 40
ID : 12 classNum : 41
ID : 13 classNum : 42
ID : 14 classNum : 43
ID : 15 classNum : 44
ID : 16 classNum : 45
ID : 17 classNum : 46
ID : 18 classNum : 47
ID : 19 classNum : 48
ID : 20 classNum : 49
就像我說的,你可以自由使用2D數組。 如果它有正當理由,那么它可能有意義,但根據我在你的問題中看到的內容,你可以更好地使用一維陣列。 如果您有任何疑問,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.