如何在循环遍历外部struct C Program时循环遍历struct中的struct

时间:2014-12-04 11:09:33

标签: c

您好我正在尝试在结构内部创建一个结构,第一个结构将包含许多学生的详细信息,第二个结构将包含每个学生的许多模块的详细信息。每次要求用户输入每个学生的详细信息。我能够创建一个称为数据的学生结构实例,每次循环遍历每个数据实例,并扫描每个学生的信息,只对我有用。我现在正在尝试创建另一个内部循环,它将扫描许多不同的模块,将这些模块分配给每个学生。我遇到了第二个循环的问题,并希望得到一些指导。

struct module{
char moduleid[5];
int credit;
float grade;
};

//create structure student at includes a datatype
//module

struct student{
    char id[10];
    char fname[15];
    char lname[15];
    struct module results;
};

int main()
{
    int i;
    int j;
    int numStuds;
    int numMods = 10;

printf("Enter number of students\n");
scanf("%d",&numStuds);

struct student data[numStuds]; //create an instance of structure student called data
struct data.results mods[numMods];

//input data
for (i=0; i<numStuds; i++){
printf("PLEASE ENTER STUDENT DATA :\n\nID, FNAME AND LNAME\n");
scanf("%s%s%s",data[i].id,data[i].fname,data[i].lname);
    for (j=0; j<numMods; j++){
        printf("\nENTER MODULE DATA: \nMODULEID, CREDIT, GRADE :\n");
        scanf("%s%d%f",data[i].results.mods[j].moduleid,&data[i].result.smods[j].credit,&data[i].results.mods[j].grade);
        }
}

3 个答案:

答案 0 :(得分:2)

我认为您的主要问题是,在学生结构中声明“结果”的方式中,每个学生只能得到一个结果。尝试使用静态数组(如果您知道有多少结果),或者如果要在运行时声明其大小,请尝试使用动态数组。

e.g

struct student{
    char id[10];
    char fname[15];
    char lname[15];
    struct module *results; //Pointer to declare a dynamic array
};

用于静态声明

struct student{
    char id[10];
    char fname[15];
    char lname[15];
    struct module results[size]; //Pointer to declare a dynamic array
};

如果您使用指针解决方案,请记住使用“ - &gt;”访问该属性操作

答案 1 :(得分:0)

就像acostela所说,你可能想要一个指向动态数组的指针。但是,我不明白为什么每个学生都需要多个结果。因此,当您输入学生人数时,您只知道每个学生都有一个模块,如果您使用data.result,则称为data->resultmalloc。如果你真的需要动态数组,我可以向你展示一些宏来轻松实现这一点。

答案 2 :(得分:0)

好。我将向您展示创建和删除宏,您可以使用reallocmemmove进行扩展,插入和删除;将它们全部写出来需要我太长时间。

#include <stdint.h>

#define ARRAY_DECL(name, type) struct { uint32_t count; type *array } name;

#define ARRAY_DESTROY(name) free(name.array);

这些宏创建了所谓的anonymous structure;这意味着它是独一无二的struct,在这种情况下称为name。然后ARRAY_DESTROY释放结构内的数组。