自己写的c语言程序报错

期末c语言大作业,写了一个核酸信息查询系统,如下,但总是不能达到自己想要的效果。例如,第一步输入1后再输入学号会报错,输入2会直接跳到error。是因为studentidnumber这个变量在一个函数中被附值后不能到其他函数中去吗?
请问一下有哪些错误?

#include<stdio.h>
#include<string.h>
#define N 120//专业人数
//该程序面向人群
int A,B,* a=&A, * b=&B,i;
char * studentidnumber;

struct student {
    char name[10];//学生姓名
    char sex[10];//学生性别
    char IDnumber[20];//身份证号码
    char studentidnumber[15];//学生学号
    char tel[11];//学生手机号码
}student[120] = { { "张三","女","6546468464846","2022131001","46154531" }, {"李四","男","486546765445","2022131002","1615464654"},
{"李青","男","4646878745155","2022131003","1546854654"} };
//学生基本信息
struct Nucleic_acid_information {
    int year;
    int month;
    int day;
    int epona;//核酸有效期限
    int nat;//接种疫苗次数
                     

}NA[120] = { {2022,12,9,72,3},{2022,12,10,48,2},{2022,12,9,72,3},{2022,12,9,72,2},{2022,12,11,48,3}, {2022,12,9,72,3} };
//核酸检测信息
struct vehicle_information
{
    char vehicle[30];
    char start[30];//起始站
    char end[30];//终点站
    char start_time[30];//出发时间
}vehicle[120] = { {"火车","太原南站","汝州站","2022.12.11"},{"飞机","武宿机场","合肥站","2022.12.11"} };
//回家车辆信息

void detection(char * studentidnumber);
void choice(int * b);
void  screen();
int error(int * a);
void end();
void menu();//调用函数声明
void choice1(int * a);

int main()
{
    menu();
    printf("请选择你的下一个操作(请输入1或2):");
    scanf_s("%d",a);//第一个菜单选项操作
    choice1(a);
    return 0;
}
void choice1(int * a)
{
    while (A != 1 && 2)
    {
        error(a);
    }//当输入的a不为1或2时系统报错并重新输入
    if (A == 1)
    {
        printf("请输入你的学号:");
        scanf_s("%s", studentidnumber);
        detection(studentidnumber);
        screen();
        printf("请选择你的下一个操作(请输入1、2或3):");
        scanf_s("%d", b);
        choice(b);
    }//选择选项1时下一个菜单操作
    else
        end();//选择选项2时的结束界面

}
void detection(char * studentidnumber)
{
    
    for(i=0;i<N;i++)
        if (strcmp ( studentidnumber, student[i].studentidnumber)==0)
            printf("姓名:%s\n性别:%s\n身份证号码:%s\n学号:%s\n手机号码:%s\n", student[i].name, student[i].sex, student[i].IDnumber, student[i].tel);
        while(strcmp(studentidnumber, student[i].studentidnumber)!=0)
            {
                printf("Don't have the student!");
                printf("请重新输入你的学号:");
                scanf_s("%s", studentidnumber);
                detection(studentidnumber);
            }
    
}
void screen()
{
    printf("***************************************************** \n");
    printf("*             1.查询该学生核酸信息                           \n");
    printf("*             2.查询该学生回家车辆信息                       \n");
    printf("*             3.返回主菜单                             \n");
    printf("*****************************************************\n");
    printf("\n\n\n\n");

}
void menu()
{
    printf("***************************************************** \n");
    printf("*             1.进入查询界面                           \n");
    printf("*             2.退出查询                       \n");
    printf("*****************************************************\n");
    printf("\n\n\n\n");
}
void end()
{
    printf("***************************************************** \n");
    printf("*                                     \n");
    printf("*                   谢谢你的使用!                    \n");
    printf("*                                 \n");
    printf("*****************************************************\n");
    printf("\n\n\n\n");
}
int error(int * a)
{
    printf("***************************************************** \n");
    printf("*                                     \n");
    printf("*                     输入错误!                    \n");
    printf("*                                 \n");
    printf("*****************************************************\n");
    printf("\n\n\n\n");
    printf("请选择你的下一个操作(请输入1或2):");
    scanf_s("%d", a);
    return (A);
}
void choice(int * b)
{
    while (B != 1 && 2 && 3)
    {
        printf("***************************************************** \n");
        printf("*                                     \n");
        printf("*                     输入错误!                    \n");
        printf("*                                 \n");
        printf("*****************************************************\n");
        printf("\n\n\n\n");
        printf("请选择你的下一个操作(请输入1、2或3):");
        scanf_s("%d", b);
    }
    if (B == 1);
    printf("接种日期:%d-%d-%d\n核酸有效期限:%d\n接种疫苗次数:%d\n", NA[i].year, NA[i].month, NA[i].day, NA[i].epona, NA[i].nat);
    if (B == 2);
    printf("交通工具:%s\n起始站:%s\n终点站:%s\n,出发时间:%s\n", vehicle[i].vehicle, vehicle[i].start, vehicle[i].end, vehicle[i].start_time);
    if (B == 3);
    menu();
    {
         printf("请选择你的下一个操作(请输入1或2):");
         scanf_s("%d", a);//第一个菜单选项操作
         choice1(a);
    }

}

scanf_s("%s", studentidnumber);
改为
scanf_s("%s", studentidnumber,15);

while (A != 1 && 2)改为 if(A!=1 && A!=2)

#include<stdio.h>
#include<string.h>
#define N 120//专业人数
//该程序面向人群
int A,B,* a=&A, * b=&B,i;
char  studentidnumber[15];
struct student {
    char name[10];//学生姓名
    char sex[10];//学生性别
    char IDnumber[20];//身份证号码
    char studentidnumber[15];//学生学号
    char tel[11];//学生手机号码
}student[120] = { { "张三","女","6546468464846","2022131001","46154531" }, {"李四","男","486546765445","2022131002","1615464654"},
{"李青","男","4646878745155","2022131003","1546854654"} };
//学生基本信息
struct Nucleic_acid_information {
    int year;
    int month;
    int day;
    int epona;//核酸有效期限
    int nat;//接种疫苗次数
}NA[120] = { {2022,12,9,72,3},{2022,12,10,48,2},{2022,12,9,72,3},{2022,12,9,72,2},{2022,12,11,48,3}, {2022,12,9,72,3} };
//核酸检测信息
struct vehicle_information
{
    char vehicle[30];
    char start[30];//起始站
    char end[30];//终点站
    char start_time[30];//出发时间
}vehicle[120] = { {"火车","太原南站","汝州站","2022.12.11"},{"飞机","武宿机场","合肥站","2022.12.11"} };
//回家车辆信息
void detection(char * studentidnumber);
void choice(int * b);
void  screen();
int error(int * a);
void end();
void menu();//调用函数声明
void choice1(int * a);
int main()
{
    menu();
    printf("请选择你的下一个操作(请输入1或2):");
    scanf_s("%d",a);//第一个菜单选项操作
    choice1(a);
    return 0;
}
void choice1(int * a)
{
    while (A != 1 && A !=2)
    {
        error(a);
    }//当输入的a不为1或2时系统报错并重新输入
    if (A == 1)
    {
        printf("请输入你的学号:");
        scanf_s("%s", studentidnumber,15);
        detection(studentidnumber);
        screen();
        printf("请选择你的下一个操作(请输入1、2或3):");
        scanf_s("%d", b);
        choice(b);
    }//选择选项1时下一个菜单操作
    else
        end();//选择选项2时的结束界面
}
void detection(char * studentidnumber)
{
    for(i=0;i<N;i++)
    {
        if (strcmp ( studentidnumber, student[i].studentidnumber)==0)
        {
            printf("姓名:%s\n性别:%s\n身份证号码:%s\n学号:%s\n手机号码:%s\n", student[i].name, student[i].sex, student[i].IDnumber, student[i].studentidnumber,student[i].tel);
            break;
        }
    }
    if(i==N)
    {
        printf("Don't have the student!");
        printf("请重新输入你的学号:");
        scanf_s("%s", studentidnumber,15);
        detection(studentidnumber);
    }
}
void screen()
{
    printf("***************************************************** \n");
    printf("*             1.查询该学生核酸信息                           \n");
    printf("*             2.查询该学生回家车辆信息                       \n");
    printf("*             3.返回主菜单                             \n");
    printf("*****************************************************\n");
    printf("\n\n\n\n");
}
void menu()
{
    printf("***************************************************** \n");
    printf("*             1.进入查询界面                           \n");
    printf("*             2.退出查询                       \n");
    printf("*****************************************************\n");
    printf("\n\n\n\n");
}
void end()
{
    printf("***************************************************** \n");
    printf("*                                     \n");
    printf("*                   谢谢你的使用!                    \n");
    printf("*                                 \n");
    printf("*****************************************************\n");
    printf("\n\n\n\n");
}
int error(int * a)
{
    printf("***************************************************** \n");
    printf("*                                     \n");
    printf("*                     输入错误!                    \n");
    printf("*                                 \n");
    printf("*****************************************************\n");
    printf("\n\n\n\n");
    printf("请选择你的下一个操作(请输入1或2):");
    scanf_s("%d", a);
    return (A);
}
void choice(int * b)
{
    while (B != 1 && B!=2 && B!=3)
    {
        printf("***************************************************** \n");
        printf("*                                     \n");
        printf("*                     输入错误!                    \n");
        printf("*                                 \n");
        printf("*****************************************************\n");
        printf("\n\n\n\n");
        printf("请选择你的下一个操作(请输入1、2或3):");
        scanf_s("%d", b);
    }
    if (B == 1)
        printf("接种日期:%d-%d-%d\n核酸有效期限:%d\n接种疫苗次数:%d\n", NA[i].year, NA[i].month, NA[i].day, NA[i].epona, NA[i].nat);
    if (B == 2)
        printf("交通工具:%s\n起始站:%s\n终点站:%s\n,出发时间:%s\n", vehicle[i].vehicle, vehicle[i].start, vehicle[i].end, vehicle[i].start_time);
    if (B == 3)
        menu();
    {
         printf("请选择你的下一个操作(请输入1或2):");
         scanf_s("%d", a);//第一个菜单选项操作
         choice1(a);
    }
}

img

choice1中的while(A!=1&&2)中的逻辑是A!=1,并且2,由于2为true,所以相当于是while(A!=1),输入2当然会错,应该是while(A!=1&&A!=2),这样才是A!=1,并且A!=2
同理,choice中应该是while(B!=1&&B!=2&&B!=3)