C语言,引发的异常: 0xC0000005: 写入位置 0x00F00000 时发生访问冲突。

#引发的异常: 0xC0000005: 写入位置 0x00F00000 时发生访问冲突。
我用的是VS2019
以下是我的代码

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

typedef struct
{
    char id[10];
    char name[20];
    char score[10];
}student;

#define N 1024

void menu(int* n)
{
    printf("\t\t\t*********************************************\n");
    printf("\t\t\t\t\t1.查找学生信息\n");
    printf("\t\t\t\t\t2.按成绩进行排序\n");
    printf("\t\t\t\t\t3.合并信息表\n");
    printf("\t\t\t\t\t4.创建补考信息表\n");
    printf("\t\t\t\t\t0.退出\n");
    printf("\t\t\t*********************************************\n");
    printf("请输入操作数0-4:");
    scanf_s("%d", n);
}//创建菜单

void Printfstudent(student p[N], int len)
{
    int i;
    printf("学号\t\t姓名\t\t分数\n\n");
    for (i = 0; i < len; i++)
    {
        printf("%s\t\t", p[i].id);
        printf("%c%c%c%c%c%c%c%c%c\t\t", p[i].name[0], p[i].name[1], p[i].name[2], p[i].name[3], p[i].name[4], p[i].name[5], p[i].name[6], p[i].name[7], p[i].name[8]);
        printf("%s\t\\t\n", p[i].score);
    }
}

int visit(student p[N], int len, int i)
{
    int k = 0;
    while (p[i].score[k] != '\0')
        k++;
    return k;
}



void Sort(student p[N], int len)
{
    student st;
    int i, j, a, b;
    for (i = 0; i < len - 1; i++)
    {
        for (j = 0; j < len - 1 - i; j++)
        {
            if (strcmp(p[j].score, p[j + 1].score) < 0)
            {
                st = p[j];
                p[j] = p[j + 1];
                p[j + 1] = st;
            }
            a = visit(p, len, j);
            b = visit(p, len, j + 1);
            if (a < b)
            {
                st = p[j];
                p[j] = p[j + 1];
                p[j + 1] = st;

            }


        }
    }
    Printfstudent(p, len);
}

void serch(student p[N], int len)
{
    int i, j;
    int flat = 0;
    char num[100];
    char name1[100];
    printf("请输入1或2,1按学号查找,2按姓名查找:");
    scanf_s("%d", &i);
    if (i == 1)
    {
        printf("请输入要查找的学号:");
        scanf_s(" %s", &num);
        for (j = 0; j < len; j++)
        {
            if (strcmp(p[j].id, num) == 0)
            {
                flat++;
                break;
            }
        }
        if (flat == 0)
        {
            printf("学号出现错误!\n");
        }
        else
        {
            printf("学号: %s,姓名: %c%c%c%c%c%c%c%c%c,得分: %s\n", p[j].id, p[j].name[0], p[j].name[1], p[j].name[2], p[j].name[3], p[j].name[4], p[j].name[5], p[j].name[6], p[j].name[7], p[j].name[8], p[j].score);
        }
    }
    else if (i == 2)
    {
        flat = 0;
        printf("请输入要查找的姓名:");
        scanf_s(" %s", &name1,50);
        for (j = 0; j < len; j++)
        {
            if (strcmp(p[j].name, name1) == 0)
            {
                flat++;
                printf("学号: %s,姓名: %c%c%c%c%c%c%c%c%c,得分: %s\n", p[j].id, p[j].name[0], p[j].name[1], p[j].name[2], p[j].name[3], p[j].name[4], p[j].name[5], p[j].name[6], p[j].name[7], p[j].name[8], p[j].score);
                break;
            }
        }
        if (!flat)
        {
            printf("姓名输入有误!\n");
        }
    }
}

//文件1.txt的读入
int dos1(student p[N], int len)
{
    int i, k;
    char a[200];
    FILE* fp = fopen("1.txt", "r+");
    if (fp == NULL)
        return 1;
    fgets(a, 200, fp);
    fclose(fp);
    i = 0; len = 0; k = 0;
    while (a[i] != '#')
    {
        while (a[i] != ',')
        {
            p[len].id[k] = a[i];
            i++; k++;
        }
        i++; k = 0;
        while (a[i] != ',')
        {
            p[len].name[k] = a[i];
            i++; k++;
        }
        i++; k = 0;

        while (a[i] != '&')
        {
            p[len].score[k] = a[i];
            i++; k++;
        }
        i++; k = 0; len++;
    }

    return len;
}


//文件2.txt的读入
int dos2(student p[N], int len)
{
    int i, k;
    char b[200];
    FILE* fp = fopen("2.txt", "r+");
    if (fp == NULL)
        return 1;
    fgets(b, 200, fp);
    fclose(fp);
    i = 0; k = 0;
    while (b[i] != '#')
    {
        while (b[i] != ',')
        {
            p[len].id[k] = b[i];
            i++; k++;

        }
        i++; k = 0;
        while (b[i] != ',')
        {
            p[len].name[k] = b[i];
            i++; k++;

        }
        i++; k = 0;
        while (b[i] != '&')
        {
            p[len].score[k] = b[i];
            i++; k++;
        }
        i++; k = 0; len++;
    }
    return len;
}

//合并到文件3.txt
void dos3(student p[N], int len)
{
    FILE* fp;
    int i;
    fp = fopen("3.txt", "w+");
    for (i = 0; i < len; i++)
    {
        fprintf(fp, "%s,%c%c%c%c%c%c%c%c%c,%s &", p[i].id, p[i].name[0], p[i].name[1], p[i].name[2], p[i].name[3], p[i].name[4], p[i].name[5], p[i].name[6], p[i].name[7], p[i].name[8], p[i].score);
    }
    fclose(fp);
}

//将补考的人的名单输出到文件4.txt
void dos4(student p[N], int len)
{
    FILE* fp;
    int i = 0, a;
    char b[2] = "60";
    fp = fopen("4.txt", "w+");
    while (i < len)
    {

        a = visit(p, len, i);
        if (a == 3) i++;
        else if (strcmp(p[i].score, b) > 0)
            i++;
        else if (strcmp(p[i].score, b) < 0)
        {
            fprintf(fp, " %s,%c%c%c%c%c%c%c%c%c,%s &", p[i].id, p[i].name[0], p[i].name[1], p[i].name[2], p[i].name[3], p[i].name[4], p[i].name[5], p[i].name[6], p[i].name[7], p[i].name[8], p[i].score);
            i++;
        }
    }
    fclose(fp);
}

void main()
{
    int n, len;
    student p[N] = { 0 };
    len = dos1(p, &len);
    len = dos2(p, &len);
    while (1)
    {
        menu(&n);
        switch (n)
        {
        case 1:serch(p, len);
            break;
        case 2:Sort(p, len);
            break;
        case 3:dos3(p, len);
            printf("合并完成\n");
            break;
        case 4:dos4(p, len);
            printf("创建完成\n");
            break;
        case 0:printf("欢迎再次使用.\n");
            break;
        default:
            printf("您的输入有误,请重新输入.\n");
            break;
        }
    }
}


#include <stdio.h>
#include <string.h>
typedef struct
{
    char id[10];
    char name[20];
    char score[10];
}student;
#define N 1024
void menu(int* n)
{
    printf("\t\t\t*********************************************\n");
    printf("\t\t\t\t\t1.查找学生信息\n");
    printf("\t\t\t\t\t2.按成绩进行排序\n");
    printf("\t\t\t\t\t3.合并信息表\n");
    printf("\t\t\t\t\t4.创建补考信息表\n");
    printf("\t\t\t\t\t0.退出\n");
    printf("\t\t\t*********************************************\n");
    printf("请输入操作数0-4:");
    scanf_s("%d", n);
}//创建菜单
void Printfstudent(student p[N], int len)
{
    int i;
    printf("学号\t\t姓名\t\t分数\n\n");
    for (i = 0; i < len; i++)
    {
        printf("%s\t\t", p[i].id);
        printf("%c%c%c%c%c%c%c%c%c\t\t", p[i].name[0], p[i].name[1], p[i].name[2], p[i].name[3], p[i].name[4], p[i].name[5], p[i].name[6], p[i].name[7], p[i].name[8]);
        printf("%s\t\\t\n", p[i].score);
    }
}
int visit(student p[N], int len, int i)
{
    int k = 0;
    while (p[i].score[k] != '\0')
        k++;
    return k;
}

void Sort(student p[N], int len)
{
    student st;
    int i, j, a, b;
    for (i = 0; i < len - 1; i++)
    {
        for (j = 0; j < len - 1 - i; j++)
        {
            if (strcmp(p[j].score, p[j + 1].score) < 0)
            {
                st = p[j];
                p[j] = p[j + 1];
                p[j + 1] = st;
            }
            a = visit(p, len, j);
            b = visit(p, len, j + 1);
            if (a < b)
            {
                st = p[j];
                p[j] = p[j + 1];
                p[j + 1] = st;
            }

        }
    }
    Printfstudent(p, len);
}
void serch(student p[N], int len)
{
    int i, j;
    int flat = 0;
    char num[100];
    char name1[100];
    printf("请输入1或2,1按学号查找,2按姓名查找:");
    scanf_s("%d", &i);
    if (i == 1)
    {
        printf("请输入要查找的学号:");
        scanf_s("%s", &num);
        for (j = 0; j < len; j++)
        {
            if (strcmp(p[j].id, num) == 0)
            {
                flat++;
                break;
            }
        }
        if (flat == 0)
        {
            printf("学号出现错误!\n");
        }
        else
        {
            printf("学号: %s,姓名: %c%c%c%c%c%c%c%c%c,得分: %s\n", p[j].id, p[j].name[0], p[j].name[1], p[j].name[2], p[j].name[3], p[j].name[4], p[j].name[5], p[j].name[6], p[j].name[7], p[j].name[8], p[j].score);
        }
    }
    else if (i == 2)
    {
        flat = 0;
        printf("请输入要查找的姓名:");
        scanf_s(" %s", &name1, 50);
        for (j = 0; j < len; j++)
        {
            if (strcmp(p[j].name, name1) == 0)
            {
                flat++;
                printf("学号: %s,姓名: %c%c%c%c%c%c%c%c%c,得分: %s\n", p[j].id, p[j].name[0], p[j].name[1], p[j].name[2], p[j].name[3], p[j].name[4], p[j].name[5], p[j].name[6], p[j].name[7], p[j].name[8], p[j].score);
                break;
            }
        }
        if (!flat)
        {
            printf("姓名输入有误!\n");
        }
    }
}
//文件1.txt的读入
int dos1(student p[N], int len)
{
    int i, k;
    char a[200];
    FILE* fp = fopen("1.txt", "r+");
    if (fp == NULL)
        return 1;
    fgets(a, 200, fp);
    fclose(fp);
    i = 0; len = 0; k = 0;
    while (a[i] != '#')
    {
        while (a[i] != ',')
        {
            p[len].id[k] = a[i];
            i++; k++;
        }
        i++; k = 0;
        while (a[i] != ',')
        {
            p[len].name[k] = a[i];
            i++; k++;
        }
        i++; k = 0;
        while (a[i] != '&')
        {
            p[len].score[k] = a[i];
            i++; k++;
        }
        i++; k = 0; len++;
    }
    return len;
}

//文件2.txt的读入
int dos2(student p[N], int len)
{
    int i, k;
    char b[200];
    FILE* fp = fopen("2.txt", "r+");
    if (fp == NULL)
        return 1;
    fgets(b, 200, fp);
    fclose(fp);
    i = 0; k = 0;
    while (b[i] != '#')
    {
        while (b[i] != ',')
        {
            p[len].id[k] = b[i];
            i++; k++;
        }
        i++; k = 0;
        while (b[i] != ',')
        {
            p[len].name[k] = b[i];
            i++; k++;
        }
        i++; k = 0;
        while (b[i] != '&')
        {
            p[len].score[k] = b[i];
            i++; k++;
        }
        i++; k = 0; len++;
    }
    return len;
}
//合并到文件3.txt
void dos3(student p[N], int len)
{
    FILE* fp;
    int i;
    fp = fopen("3.txt", "w+");
    for (i = 0; i < len; i++)
    {
        fprintf(fp, "%s,%c%c%c%c%c%c%c%c%c,%s &", p[i].id, p[i].name[0], p[i].name[1], p[i].name[2], p[i].name[3], p[i].name[4], p[i].name[5], p[i].name[6], p[i].name[7], p[i].name[8], p[i].score);
    }
    fclose(fp);
}
//将补考的人的名单输出到文件4.txt
void dos4(student p[N], int len)
{
    FILE* fp;
    int i = 0, a;
    char b[3] = "60";
    fp = fopen("4.txt", "w+");
    while (i < len)
    {
        a = visit(p, len, i);
        if (a == 3) i++;
        else if (strcmp(p[i].score, b) > 0)
            i++;
        else if (strcmp(p[i].score, b) < 0)
        {
            fprintf(fp, " %s,%c%c%c%c%c%c%c%c%c,%s &", p[i].id, p[i].name[0], p[i].name[1], p[i].name[2], p[i].name[3], p[i].name[4], p[i].name[5], p[i].name[6], p[i].name[7], p[i].name[8], p[i].score);
            i++;
        }
    }
    fclose(fp);
}
void main()
{
    int n, len=0;
    student p[N] = { 0 };
    len = dos1(p, len);
    len = dos2(p, len);
    while (1)
    {
        menu(&n);
        switch (n)
        {
        case 1:serch(p, len);
            break;
        case 2:Sort(p, len);
            break;
        case 3:dos3(p, len);
            printf("合并完成\n");
            break;
        case 4:dos4(p, len);
            printf("创建完成\n");
            break;
        case 0:printf("欢迎再次使用.\n");
            break;
        default:
            printf("您的输入有误,请重新输入.\n");
            break;
        }
    }
}

可以运行了,还是有类似的错误

img

img

num是字符串,不能用&
改为

scanf_s("%s", num);