簡體   English   中英

如何在C中填充二維結構數組?

[英]How do you fill a 2D array of structs in C?

在我的程序中,我創建了一個名為studentstruct ,它有兩個int字段IDclassNum 如果我制作一個包含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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM