如何在C语言中填充一个二维结构体数组?

3
在我的程序中,我创建了一个名为“student”的结构体,它有两个int字段“ID”和“classNum”。如果我创建一个由20个学生组成的二维数组,如何使用循环遍历该数组并为每个学生分配其值?因为这些值按数字顺序排列,分别为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;
}

“students” 是什么?你没有在任何地方使用你的二维数组。 - ameyCU
抱歉,写错了。应该是“教室”而不是“学生”,我现在会修正。 - Josh Burkman
抱歉,我刚才在看一个桌游的东西,所以写错了,最后应该返回“教室”。我已经修复了你们提到的两个错误。 - Josh Burkman
1
指向指针的指针与二维数组完全没有任何关系。 - Lundin
return classroom; 不会起作用(也不必要) - M.M
显示剩余2条评论
3个回答

3

您需要使用两个循环而不是一个,如下所示:

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是全局的,因此您不需要返回它。

1
兄弟.. 5<5 真的吗 - Minato
@Minato 我冒昧地编辑了他的答案中的拼写错误。 - Magisch

1

从您的问题中我可以看出您不知道如何初始化二维结构数组。因此,您应该参考this。要填充二维数组,您总是需要两个for循环,所以请记住这一点。

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将被分配给classroom[x][y].ID,并且每次都会从其初始值i=1增加+1。同样,classNumba将被分配到classroom[x][y].classNum中,每次它将从其初始值classNumba=30增加+1。


这很有道理!谢谢,我已经编译成功了。 - Josh Burkman

0

您的代码存在一些微妙的问题,首要问题是:为什么您想要一个二维结构体数组,而不是使用简单数组更加合理呢? 无论如何,您可以自由选择使用二维数组,但就您的问题陈述而言,绝对没有必要这样做。

使用简单的一维数组可以大大简化您的代码,以及函数之间参数的传递。尝试使用以下代码进行比较:

#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数组。如果有充分的理由,那么这可能是有意义的,但根据我在你的问题中所看到的,你最好使用1D数组。如果你有任何问题,请让我知道。


makeClass 返回是多余的。 - M.M
是的,但它提供了一个选项来分配返回或在需要时在memcpy中使用。我同意,但根据用途,返回值具有价值 :) - David C. Rankin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接