如何正确初始化/访问具有多个源的结构数组?

时间:2015-02-20 20:34:06

标签: c arrays struct

我正在完成一项需要不同来源和标题的学校作业。 我有data.h,其中包含以下结构信息。

typedef struct volunteer{
    int hours;
    int tasksCompleted;
}volunteer;

typedef struct employee{
    float salary;
    int serviceYears;
    int level;
}employee;

typedef struct person{
    char firstName[20];
    char lastName[20];
    char telephoneNum[20];
    union{
        employee e;
        volunteer v;
    };
}newPerson;

然后我有一个volunteer.cemployee.c,其中包含处理打印记录,按姓名搜索某人等内容的功能等。

一个mainMenu.c,显示菜单并接受用户输入以添加个人记录。

最后,mainProgram.c将它们联系在一起。

我想有一群人[20],我必须能够访问它们(获取,设置等)。 我的主要问题在于,我不确定初始化人员阵列的适当位置在哪里,我不确定在哪里为人员创建get / set函数。 < / p>

我试着在mainMenu.c的主函数中初始化,如此。

int main(){
    //mainMenu();
    //menu();

    newPerson person[20];

    strcpy(person[0].firstName, "George");
    strcpy(person[0].lastName, "Michaels");
    strcpy(person[0].telephoneNum, "5645651232");
    person[0].v.hours= 44;
    person[0].v.tasksComplete = ;

    printf("The name is = %s\n", person[0].firstName);
    printf("The number of tasks completed is = %d\n", person[0].v.tasksCompleted);

    //testing my addFirstName method below, 1 for person[1] since I already    did person [0]
    addFirstName(1);

    return 0;
}

我只是想确保在向人[0]添加信息后能够正确访问/阅读,所以现在主要内容没什么重要的。

然后我有一个addFirstName(int num)函数,可以从menu.c中调用。 (但是从mainProgram.c atm测试它)。我不确定这是否是最好的方法,但是菜单会计算从0开始添加的记录数。所以int num = 0,并且将是addFirstName(0);

void addFirstName(int num){
    char firstName[20];
    printf("\n\tEnter Volunteer's first name: ");
    scanf("%20s", firstName);
    strcpy(person[num].firstName, firstName);
}

但是,当我尝试这样做的时候,即使我在main函数中初始化,它也表示该人未申报。这让我觉得我没有在理想的地方初始化人群。

如果我将一个struct人作为函数参数会更好吗?

对不起,如果我的问题有点乱。基本上我只想知道初始化人数组的最合理的位置/方法在哪里,以及获得/设置我的get / set方法的最佳位置/方法,因为我需要获取/设置person我的其他来源,(volunteer.c,employee.c,mainMenu.c)

2 个答案:

答案 0 :(得分:1)

void addFirstName(newPerson *const person){
    char firstName[20];
    printf("\n\tEnter Student's first name: ");
    scanf("%20s", firstName);
    strcpy(person->firstName, firstName);
}

在main.c中

addFirstName(&person[1]);

答案 1 :(得分:0)

你的函数addFirstName正在引用在main中声明的数组,这就是为什么它表示未声明的人。

就像你说的那样,你可以将person数组作为函数参数,它将起作用

void addFirstName(newPerson *person, int num){
    char firstName[20];
    printf("\n\tEnter Student's first name: ");
    scanf("%20s", firstName);
    strcpy(person[num].firstName, firstName);
}

关于初始化人员阵列的方法的最佳方式,这取决于你,你可以拥有自己的风格并选择最适合你的方式,因为你已经拥有{{1 }和volunteer.c,也许嵌套逻辑步骤为employee.c