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

How to access structure array from other function and assign value

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

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

首先,在menu2中,scanf("%s", &List[cnt].year);应该是scanf("%s", List[cnt].year);。其次,我认为您应该考虑 Counter 的工作方式。例如,调用menu2,然后调用menu1,什么也打印不出来。原因是在menu1中,for循环你不能进去执行任何东西。那时候你的Counter是0,也就是menu1中的cnt是0.