您好我正在尝试在结构内部创建一个结构,第一个结构将包含许多学生的详细信息,第二个结构将包含每个学生的许多模块的详细信息。每次要求用户输入每个学生的详细信息。我能够创建一个称为数据的学生结构实例,每次循环遍历每个数据实例,并扫描每个学生的信息,只对我有用。我现在正在尝试创建另一个内部循环,它将扫描许多不同的模块,将这些模块分配给每个学生。我遇到了第二个循环的问题,并希望得到一些指导。
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);
}
}
答案 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->result
或malloc
。如果你真的需要动态数组,我可以向你展示一些宏来轻松实现这一点。
答案 2 :(得分:0)
好。我将向您展示创建和删除宏,您可以使用realloc
和memmove
进行扩展,插入和删除;将它们全部写出来需要我太长时间。
#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
释放结构内的数组。