执行6的时候名字怎么由链表转到数组保存并输出

问题遇到的现象和发生背景 版本:vs2013
问题:一个字母的时候就可以排序,多个英文甚至中文的时候就会吃掉代码
运行结果及报错内容 :代码中一堆#的地方就是不知道该怎么处理的代码(怎么将多个字符串放在二维数组里面,一行放一个字符串)
我的解答思路和尝试过的方法
我想要达到的结果:排序时名字可以一起显示在框框内
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
struct student *head=NULL;

struct student //学生信息结构体
{
    int number;
    char name[20];
    int chinese;
    int math;
    int sum;
    struct student *next;
};

struct student *add()//录入学生信息
{
    printf("已进入学生信息录入界面!\n");
    int mark; int jshu = 1;
    struct student *head,*New, *p;
    head = (struct student*)malloc(sizeof(struct student));
    if (head != NULL)
    {
        printf("请输入第%d个学生的学号:", jshu); scanf("%d", &head->number);
        printf("请输入第%d个学生的姓名:", jshu); scanf("%s", head->name);
        printf("请输入第%d个学生的语文:", jshu); scanf("%d", &head->chinese);
        printf("请输入第%d个学生的数学:", jshu); scanf("%d", &head->math);
        jshu++;
        head->next = NULL;
        p = head;
        printf("录入成功!\n");
    }
    else
    {
        printf("空间已满,录入失败!\n"); return ;
    }
    printf("是否继续录入学生信息(输入1:继续 或者0:放弃):");
    scanf("%d", &mark);
    while (mark)
    {
        New = (struct student*)malloc(sizeof(struct student));
        if (New != NULL)
        {
            printf("请输入第%d个学生的学号:", jshu); scanf("%d", &New->number);
            printf("请输入第%d个学生的姓名:", jshu); scanf("%s", New->name);
            printf("请输入第%d个学生的语文成绩:", jshu); scanf("%d", &New->chinese);
            printf("请输入第%d个学生的数学成绩:", jshu); scanf("%d", &New->math);
            jshu++;
            New->next = NULL;
            p->next = New;
            p = New;
            printf("录入成功!\n");
        }
        else
        {
            printf("空间已满,录入失败!\n"); return 0;
        }
        printf("是否继续录入学生信息(输入1:继续 或者0:放弃):");
        scanf("%d", &mark);

    }
    return (head);
}

void zshu(struct student *head)//求每一个学生的总分数(语文,数学)
{
    struct student *p;
    p = head;
    while (p != NULL)
    {
        p->sum = p->chinese + p->math;
        p = p->next;
    }

}

void showALL(struct student *head)//显示学生信息
{
    struct student *p;
    p = head;
    zshu(head);
    printf("           已显示所有学生信息\n");
    printf("学号    姓名   语文成绩   数学成绩   总分\n");
    while (p != NULL)
    {
        printf("%d    ",p->number);
        printf("%s    ", p->name);
        printf("%d    ", p->chinese);
        printf("%d    ", p->math);
        printf("%d    ", p->sum);
        p = p->next;
        printf("\n");
    }

}


void moddify(struct student *head)//修改学生信息
{
    
    showALL(head);
    printf("已进入学生信息录入界面!\n");
    char c[20]; int b,k;
    struct student *p; 
    p = head;
    printf("请选择要修改的学生姓名:");
    scanf("%s",&c);
    while (p != NULL)
    {
        k = strcmp(p->name, c);//知识点:一定要注意字符串是靠函数判断相等strcmp(字符串1,字符串2)只有当返回值为0的时候才是相等
        if (k == 0)
        {
            printf("找到了!\n");
            printf("学号:%d    ", p->number);
            printf("名字:%s    ", p->name);
            printf("语文成绩:%d    ", p->chinese);
            printf("数学成绩:%d    ", p->math);
            printf("总分:%d    ", p->sum);
            printf("\n是否修改该学生的信息(1:是,0:否):");
            scanf("%d", &b);
            if (b == 1)
            {
                printf("请输入修改的学生的学号:"); scanf("%d", &p->number);
                printf("请输入修改的学生的姓名:"); scanf("%s", p->name);
                printf("请输入修改的学生的语文成绩:"); scanf("%d", &p->chinese);
                printf("请输入修改的学生的数学成绩:"); scanf("%d", &p->math);
            }
            else
            {
                printf("已经取消该学生的修改!"); return;
            }
        }
        else
        {
            p = p->next;
        }
    }
    if (p == NULL)
    {
        printf("没有找到该学生的信息!"); return;
    }
}

struct student *del(struct student *head)//删除学生信息
{
    zshu(head);
    struct student *p,*p1;
    int a, b, k;
    printf("请输入要删除学生的学号");
    scanf("%d",&a);
    if (head->number == a)
    {
        printf("找到了!\n");
        printf("学号:%d    ", head->number);
        printf("名字:%s    ", head->name);
        printf("语文成绩:%d    ", head->chinese);
        printf("数学成绩:%d    ", head->math);
        printf("总分:%d    ", head->sum);
        printf("\n是否删除该学生的信息(1:是,0:否):");
        scanf("%d", &b);
        if (b == 1)
        {
            p = head;
            head = head->next;
            free(p);
            printf("删除成功!\n");
            return(head);
        }
        else
        {
            printf("已经取消该学生的删除!\n"); return(head);
        }
    }
    p = head;
    p1 = head->next;
    while (p1 != NULL&&p1->number != a)
    {
        p = p->next;
        p1 = p1->next;
    }
    if (p1 !=NULL)
    {
        printf("找到了!\n");
        printf("学号:%d    ", p1->number);
        printf("名字:%s    ", p1->name);
        printf("语文成绩:%d    ", p1->chinese);
        printf("数学成绩:%d    ", p1->math);
        printf("总分:%d    ", p1->sum);
        printf("\n是否删除该学生的信息(1:是,0:否):");
        scanf("%d", &b);
        if (b == 1)
        {
            p->next = p1->next;//知识点:以后面为基础
            free(p1);
            printf("删除成功!\n");
            return(head);
        }
        else
        {
            printf("已经取消该学生的删除!\n"); return(head);
        }
    }
    else
    {
        printf("没有找到该学生的信息!\n"); return(head);
    }
    
}

void search(struct student *head)//查找学生信息
{
    zshu(head);
    printf("已进入查找学生信息界面!\n");
    char c[20]; int k;
    struct student *p;
    p = head;
    printf("请选择要查找的学生姓名:");
    scanf("%s", &c);
    while (p != NULL&&strcmp(p->name, c)!=0)
    {
        p = p->next;
    }
    if (p != NULL)
    {

        printf("找到了!\n");
        printf("学号:%d    ", p->number);
        printf("名字:%s    ", p->name);
        printf("语文成绩:%d    ", p->chinese);
        printf("数学成绩:%d    ", p->math);
        printf("总分:%d    ", p->sum);
    }
    else
    {
        printf("没有找到该学生的信息!\n"); 
    }
}

int jshu(struct student* head)//算有多少个表(求表长)
{
    int j = 0;
    struct student* p;
    p = head;
    while (p != NULL)
    {
        p = p ->next;
        j++;
    }
    return j;
}

void sort(struct student *head)//排序以总分来排序
{
    zshu(head);
    int a[99][99]; char b[99][99]; char a1[99];
    int i,zda,j,q;
    zda=jshu(head);
    struct student *p;
    p = head;
    while (p != NULL)
    {
        for (i = 0; i < zda; i++)//链表转数组
        {
            a[i][0] = p->number;
            strcpy(b[i], p->name);//##########################
            a[i][2] = p->chinese;
            a[i][3] = p->math;
            a[i][4] = p->sum;
            p = p->next;
        }
    }
    for (i = 0; i < zda; i++)//数组的复制操作
    {
        a1[i] = a[i][4];
    }
    for (i = 0; i < zda; i++)//冒泡法排序(大到小)
    {
        for (j = 0; j < zda-1 -i; j++)
        {
            if (a1[j]<a1[j+1])
            {
                int k;
                k = a1[j];
                a1[j] = a1[j + 1];
                a1[j + 1] = k;

            }
        }
    }
    printf("学号    姓名   语文成绩   数学成绩   总分\n");
    for (i = 0; i < zda; i++)//学号 (名字) 语文 数学 总分
    {
        for (j = 0; j < zda; j++)
        {
            if (a1[i] == a[j][4])
            {
                printf("%d   ", a[j][0]);
                printf("%s   ",b[i]);//####################################################
                //for (q = 0; b[j][q] != '\0'; q++)//将保存好的名字按字符一个个输出
                //{
                //    printf("%c", b[j][q]);
                //}
                printf("%d   %d   %d\n", a[j][2],a[j][3],a[j][4]);

            }
        }
    }

}


void menu()//菜单
{
    int a, bc;
    printf("\n================================================\n");
mark:printf("|              学生信息管理系统                |\n");
    printf("================================================\n");
    printf("|              1--录入学生信息                 |\n");
    printf("|              2--显示所有学生信息             |\n");
    printf("|              3--修改学生信息                 |\n");
    printf("|              4--删除学生信息                 |\n");
    printf("|              5--查找学生信息                 |\n");
    printf("|              6--排序                         |\n");
    printf("|              0--退出系统                     |\n");
    printf("================================================\n");
    printf("请选择(0-6)\n");
    scanf("%d", &a);
    switch (a)
    {
    case 0: printf("已经退出学生信息管理系统"); return;
    case 1:head = add(); menu(); break;
    case 2: showALL(head); menu(); break;
    case 3: moddify(head); menu(); break;
    case 4:head=del(head); menu(); break;
    case 5: search(head); menu(); break;
    case 6: sort(head); menu(); break;
    default:printf("选择错误请重新选择:\n"); goto mark;
    }
}
int main()
{
    menu();
    return 0;
}

#define _CRT_SECURE_NO_WARNINGS//链表
#include <stdio.h>
#include <malloc.h>
struct student *head=NULL;//全局链表头

struct student //学生信息结构体
{
int number;
char name[20];
int chinese;
int math;
int sum;
struct student *next;
};

struct student *add()//录入学生信息
{
printf("已进入学生信息录入界面!\n");
int mark; int jshu = 1;
struct student *head,*New, p,p1;
head = (struct student
)malloc(sizeof(struct student));
if (head != NULL)
{
printf("请输入第%d个学生的学号:", jshu); scanf("%d", &head->number);
printf("请输入第%d个学生的姓名:", jshu); scanf("%s", head->name);
printf("请输入第%d个学生的语文:", jshu); scanf("%d", &head->chinese);
printf("请输入第%d个学生的数学:", jshu); scanf("%d", &head->math);
jshu++;
head->next = NULL;
p = head;
printf("录入成功!\n");
}
else
{
printf("空间已满,录入失败!\n"); return ;
}
printf("是否继续录入学生信息(输入1:继续 或者0:放弃):");
scanf("%d", &mark);
while (mark)
{
New = (struct student
)malloc(sizeof(struct student));
if (New != NULL)
{
mark:printf("请输入第%d个学生的学号:", jshu); scanf("%d", &New->number);
p1 = head;
while (p1 != NULL&&p1->number!=New->number&&p1!=New)
{
p1 = p1->next;
}
if (p1 != NULL)
{
printf("该学号已经存在,请重新输入\n");
goto mark;
}
else
{
printf("请输入第%d个学生的姓名:", jshu); scanf("%s", New->name);
printf("请输入第%d个学生的语文成绩:", jshu); scanf("%d", &New->chinese);
printf("请输入第%d个学生的数学成绩:", jshu); scanf("%d", &New->math);
jshu++;
New->next = NULL;
p->next = New;
p = New;
printf("录入成功!\n");
}

    }
    else
    {
        printf("空间已满,录入失败!\n"); return 0;
    }
    printf("是否继续录入学生信息(输入1:继续 或者0:放弃):");
    scanf("%d", &mark);

}
return (head);

}

void zshu(struct student *head)//求每一个学生的总分数(语文,数学)
{
struct student *p;
p = head;
while (p != NULL)
{
p->sum = p->chinese + p->math;
p = p->next;
}

}

void showALL(struct student *head)//显示学生信息
{
struct student *p;
p = head;
zshu(head);
printf(" 已显示所有学生信息\n");
printf("学号 姓名 语文成绩 数学成绩 总分\n");
while (p != NULL)
{
printf("%d ",p->number);
printf("%s ", p->name);
printf("%d ", p->chinese);
printf("%d ", p->math);
printf("%d ", p->sum);
p = p->next;
printf("\n");
}

}

void moddify(struct student *head)//修改学生信息
{

showALL(head);
printf("已进入学生信息修改界面!\n");
char c[20]; int b,k;
struct student *p,*p1; 
p = head;
printf("请选择要修改的学生姓名:");
scanf("%s",&c);
while (p != NULL)
{
    k = strcmp(p->name, c);//知识点:一定要注意字符串是靠函数判断相等strcmp(字符串1,字符串2)只有当返回值为0的时候才是相等
    if (k == 0)
    {
        printf("找到了!\n");
        printf("学号:%d    ", p->number);
        printf("名字:%s    ", p->name);
        printf("语文成绩:%d    ", p->chinese);
        printf("数学成绩:%d    ", p->math);
        printf("总分:%d    ", p->sum);
        printf("\n是否修改该学生的信息(1:是,0:否):");
        scanf("%d", &b);
        if (b == 1)
        {
            mark:printf("请输入修改的学生的学号:"); scanf("%d", &p->number);
            p1 = head;
            if (p1 == p)
            {
                p1 = p1->next;
            }
            while (p1 != NULL&&p1->number != p->number)
            {
                p1 = p1->next;
                if (p1 == p)
                {
                    p1 = p1->next;
                }
            }
            if (p1 != NULL)
            {
                printf("该学号已经存在,请重新输入\n");
                goto mark;
            }
            else
            {
                printf("请输入修改的学生的姓名:"); scanf("%s", p->name);
                printf("请输入修改的学生的语文成绩:"); scanf("%d", &p->chinese);
                printf("请输入修改的学生的数学成绩:"); scanf("%d", &p->math);
                printf("修改成功!\n"); return;
            }
        }
        else
        {
            printf("已经取消该学生的修改!"); return;
        }
    }
    else
    {
        p = p->next;
    }
}
if (p == NULL)
{
    printf("没有找到该学生的信息!"); return;
}

}

struct student *del(struct student *head)//删除学生信息
{
zshu(head);
struct student *p,*p1;
int a, b, k;
printf("请输入要删除学生的学号");
scanf("%d",&a);
if (head->number == a)
{
printf("找到了!\n");
printf("学号:%d ", head->number);
printf("名字:%s ", head->name);
printf("语文成绩:%d ", head->chinese);
printf("数学成绩:%d ", head->math);
printf("总分:%d ", head->sum);
printf("\n是否删除该学生的信息(1:是,0:否):");
scanf("%d", &b);
if (b == 1)
{
p = head;
head = head->next;
free(p);
printf("删除成功!\n");
return(head);
}
else
{
printf("已经取消该学生的删除!\n"); return(head);
}
}
p = head;
p1 = head->next;
while (p1 != NULL&&p1->number != a)
{
p = p->next;
p1 = p1->next;
}
if (p1 !=NULL)
{
printf("找到了!\n");
printf("学号:%d ", p1->number);
printf("名字:%s ", p1->name);
printf("语文成绩:%d ", p1->chinese);
printf("数学成绩:%d ", p1->math);
printf("总分:%d ", p1->sum);
printf("\n是否删除该学生的信息(1:是,0:否):");
scanf("%d", &b);
if (b == 1)
{
p->next = p1->next;//知识点:以后面为基础(头已经查过,以后面的内容来free)
free(p1);
printf("删除成功!\n");
return(head);
}
else
{
printf("已经取消该学生的删除!\n"); return(head);
}
}
else
{
printf("没有找到该学生的信息!\n"); return(head);
}

}

void search(struct student *head)//查找学生信息
{
zshu(head);
printf("已进入查找学生信息界面!\n");
char c[20]; int k;
struct student *p;
p = head;
printf("请选择要查找的学生姓名:");
scanf("%s", &c);
while (p != NULL&&strcmp(p->name, c)!=0)
{
p = p->next;
}
if (p != NULL)
{

    printf("找到了!\n");
    printf("学号:%d    ", p->number);
    printf("名字:%s    ", p->name);
    printf("语文成绩:%d    ", p->chinese);
    printf("数学成绩:%d    ", p->math);
    printf("总分:%d    ", p->sum);
}
else
{
    printf("没有找到该学生的信息!\n"); 
}

}

int jshu(struct student* head)//算有多少个表(求表长)
{
int j = 0;
struct student* p;
p = head;
while (p != NULL)
{
p = p ->next;
j++;
}
return j;
}

void sort(struct student *head)//排序以总分来排序
{
zshu(head);
int a[99][99]; char b[99][99]; int a1[99];
int i,zda,j,q,ha;
zda=jshu(head);
struct student *p;
p = head;
while (p != NULL)
{
for (i = 0; i < zda; i++)//链表转数组
{
a[i][0] = p->number;
strcpy(b[i], p->name);//将字符二复制到字符一
a[i][2] = p->chinese;
a[i][3] = p->math;
a[i][4] = p->sum;
p = p->next;
}
}
for (i = 0; i < zda; i++)//数组的复制操作
{
a1[i] = a[i][4];
}
for (i = 0; i < zda; i++)//冒泡法排序(大到小)
{
for (j = 0; j < zda-1 -i; j++)
{
if (a1[j]<a1[j+1])
{
int k;
k = a1[j];
a1[j] = a1[j + 1];
a1[j + 1] = k;

        }
    }
}
printf("学号    姓名   语文成绩   数学成绩   总分\n");
for (i = 0; i < zda; i++)//学号 (名字) 语文 数学 总分//利用数组进行为伪输出(不破坏原来链表数据)
{
    for (j = 0; j < zda; j++)
    {
        if (a1[i] == a[j][4])
        {
            printf("%d   ", a[j][0]);
            for (q = 0; b[j][q] != '\0'; q++)//将保存好的名字按字符一个个输出
            {
                printf("%c", b[j][q]);
            }
            printf("   ");
            printf("%d   %d   %d\n", a[j][2],a[j][3],a[j][4]);
            a[j][4] = 0;
        }
    }

}

}

void menu()//菜单
{
int a, bc;
printf("\n================================================\n");
mark:printf("| 学生信息管理系统 |\n");
printf("================================================\n");
printf("| 1--录入学生信息 |\n");
printf("| 2--显示所有学生信息 |\n");
printf("| 3--修改学生信息 |\n");
printf("| 4--删除学生信息 |\n");
printf("| 5--查找学生信息 |\n");
printf("| 6--排序 |\n");
printf("| 0--退出系统 |\n");
printf("================================================\n");
printf("请选择(0-6)\n");
scanf("%d", &a);
switch (a)
{
case 0: printf("已经退出学生信息管理系统"); return;
case 1:head = add(); menu(); break;
case 2: showALL(head); menu(); break;
case 3: moddify(head); menu(); break;
case 4:head=del(head); menu(); break;
case 5: search(head); menu(); break;
case 6: sort(head); menu(); break;
default:printf("选择错误请重新选择:\n"); goto mark;
}
}
int main()
{
menu();
return 0;
}