【问题标题】:How to loop through a struct inside a struct while looping through the outer struct C Program如何在遍历外部结构的同时遍历结构内部的结构 C 程序
【发布时间】:2015-02-02 05:49:38
【问题描述】:

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

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);
        }
}

【问题讨论】:

  • 我没有正确理解。你希望一个学生结构可以有多个结果结构吗?
  • 是的,每个学生都有许多科目(模块),所以我正在尝试创建一个包含这些科目的结构,所以我正在尝试创建一个内部循环,每次都会添加详细信息每个科目的。很抱歉造成混乱。
  • 我想遍历学生结构,并在每次迭代时,遍历结果结构并添加信息。
  • 检查我的答案,您需要在我写的学生结​​果中声明。

标签: c


【解决方案1】:

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

例如

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
};

如果您使用指针解决方案,请记住使用“->”运算符访问该属性

【讨论】:

  • 拼写错误。第二个结果[j] 是结果[j]。
【解决方案2】:

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

【讨论】:

  • 是的,如果您能提供帮助,请参阅我正在尝试通过每次添加主题名称和等级等时迭代嵌套循环来输入许多模块,例如艺术、数学、英语等。
【解决方案3】:

好的。我将只向您展示创建和删除宏,您可以使用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 然后释放结构内的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多