如何从其他函数访问结构数组并分配值

问题描述 投票:0回答:1

我的问题是,如果我将全局变量结构数组和整数值计数器从主函数传递给menu2函数,则该结构数组的内容需要修改,但没有任何改变。例如,当我在主函数中调用menu2函数并写入内容时,在调用menu2之后调用菜单1、3和4时没有任何反应。我已经尝试将菜单2上的所有“列表”更改为“列表”。您能帮我一次吗?

#include<stdio.h>
#include<string.h>

#define MAX_STUDENT 100
#define YEAR_STUDENT 7
#define MAX_NAMELEN 20


char convertScore(int score)
{
    if (score > 89)
        return 'A';
    else if (score > 79)
        return 'B';
    else if (score > 69)
        return 'C';
    else if (score > 59)
        return 'D';
    else
        return 'F';
}

typedef struct student {
    char name[MAX_STUDENT+1];
    int scoreSecurity;
    char gradeSecurity;
    int scoreAI;
    char gradeAI;
    int scoreAlgorithm;
    char gradeAlgorithm;
    int scoreDataStructure;
    char gradeDataStructure;
    int scoreOS;
    char gradeOS;
    int gradeF;
    char year[YEAR_STUDENT];
}Student;

Student List[MAX_STUDENT];
int Counter = 0;

void menu1(Student* list, int cnt)
{
    int i;
    printf("Name\tAI\tSecurity\tDataStructure\tOS\tAlgorithm\tYear\n");
    for (i = 0; i < cnt; i++) {
        printf("%s\t%c\t%c\t%c\t%c\t%c\t%s\n", List[i].name, List[i].gradeAI,
            List[i].gradeSecurity,List[i].gradeDataStructure, List[i].gradeOS, List[i].gradeAlgorithm,
            List[i].year);
    }
    printf("\n");
}

void menu2(Student* list, int cnt)
{
    char sn[21];
    printf("Student name: ");
    scanf("%s", sn);
    strcpy(List[cnt].name, sn);
    printf("Student score AI(0~100): ");
    scanf("%d", &List[cnt].scoreAI);
    List[cnt].gradeAI = convertScore(List[cnt].scoreAI);
    printf("Student score Security(0~100): ");
    scanf("%d", &List[cnt].scoreSecurity);
    List[cnt].gradeSecurity = convertScore(List[cnt].scoreSecurity);
    printf("Student score Datastructure(0~100): ");
    scanf("%d", &List[cnt].scoreDataStructure);
    List[cnt].gradeDataStructure = convertScore(List[cnt].scoreDataStructure);
    printf("Student score OS(0~100): ");
    scanf("%d", &List[cnt].scoreOS);
    List[cnt].gradeOS = convertScore(List[cnt].scoreOS);
    printf("Student score Algorithm(0~100): ");
    scanf("%d", &List[cnt].scoreAlgorithm);
    List[cnt].gradeAlgorithm = convertScore(List[cnt].scoreAlgorithm);
    printf("Student year(Junior/Senior): ");
    scanf("%s", &List[cnt].year);
    printf("\n");
}

void menu3(Student* list, int cnt)
{
    int junior=0, senior=0, i;
    for (i = 0; i < cnt; i++) {
        if (List[i].year == "Junior")
            junior++;
        else
            senior++;
    }
    printf("Junior: %d\nSenior: %d\n", junior, senior);
}
void menu4(Student* list, int cnt)
{
    int i;
    int fail = 0;
    int suck = 0;
    int yeah = 0;
    for (i = 0; i < cnt; i++) {
        if (List[i].gradeAI == 'F')
            fail++;
        else if (List[i].gradeAlgorithm == 'F')
            fail++;
        else if (List[i].gradeDataStructure == 'F')
            fail++;
        else if (List[i].gradeOS == 'F')
            fail++;
        else if (List[i].gradeSecurity == 'F')
            fail++;

        if (fail > 2)
            suck++;
        else
            yeah++;
        fail = 0;
    }
    printf("Passed: %d\nFailed: %d\n", yeah, suck);
}

c arrays pointers structure
1个回答
0
投票

首先,在menu2中,scanf("%s", &List[cnt].year);应该为scanf("%s", List[cnt].year);。其次,我认为您应该考虑Counter的工作方式。例如,在您依次呼叫menu2menu1之后,将无法打印任何内容。原因是在menu1中,您无法进入for循环执行任何操作。那时,您的Counter为0,即cnt中的menu1为0。

© www.soinside.com 2019 - 2024. All rights reserved.