为什么这个显示函数除了显示要显示的数据之外还会有乱码

void show()
{
FILE * fp;
int clas;
long long stu_code;
long long id_code;
char sex[5];
char enyear[10];
char birthday[20];
char major[10];
char name[10];
struct stu_node * tail, * head=NULL;
struct stu_node * pMove;
struct stu_node * n;
if((fp=fopen("test.dat","r"))==NULL)
{
fp=fopen("test.dat","w+");
fclose(fp);
}
while(fscanf(fp,"%s%s%s%d%s%lld%lld%s\n",name,sex,major,&clas,birthday,&stu_code,&id_code,enyear)!=EOF)
{
n=(struct stu_node * )malloc(sizeof(struct stu_node));
n->clas=clas;n->stu_code=stu_code,n->id_code=id_code;
strcpy(n->name,name);strcpy(n->sex,sex);
strcpy(n->major,major);strcpy(n->enyear,enyear);
strcpy(n->birthday,birthday);
if(head==NULL) head=n;
else tail->next=n;
tail=n;
}
fclose(fp);
pMove=head;
printf("姓名\t性别\t专业\t班级\t出生日期\t学籍号\t身份证号\t入学日期\n");
while(pMove!=NULL)
{
printf("%s\t%s\t%s\t%d\t%s\t%lld\t%lld\t%s\n",pMove->name,pMove->sex,pMove->major,pMove->clas,pMove->birthday,pMove->stu_code,pMove->id_code,pMove->enyear);
pMove=pMove->next;
}
}

修改如下,供参考:

void show()
{
    FILE* fp;
    int  clas;
    long long stu_code, id_code;
    char sex[5], enyear[10], birthday[20], major[10], name[10];
    struct stu_node* tail = NULL, * head = NULL, * pMove = NULL, * n = NULL;
    if ((fp = fopen("test.dat", "r")) == NULL)
    {
        fp = fopen("test.dat", "w+");
        fclose(fp);
        return;
    }
    while (1)
    {
        if (fscanf(fp,"%s%s%s%d%s%lld%lld%s\n", name, sex, major, &clas, 
                             birthday, &stu_code, &id_code, enyear) != 8) break;
        n = (struct stu_node*)malloc(sizeof(struct stu_node));
        n->next = NULL;
        n->clas = clas; n->stu_code = stu_code, n->id_code = id_code;
        strcpy(n->name, name);   strcpy(n->sex, sex);
        strcpy(n->major, major); strcpy(n->enyear, enyear);
        strcpy(n->birthday, birthday);
        if (head == NULL) 
            head = n;
        else 
            tail->next = n;
        tail = n;
    }
    fclose(fp);
    pMove = head;
    printf("姓名\t性别\t专业\t班级\t出生日期\t学籍号\t身份证号\t入学日期\n");
    while (pMove != NULL)
    {
        printf("%s\t%s\t%s\t%d\t%s\t%lld\t%lld\t%s\n", pMove->name, pMove->sex, pMove->major, 
                  pMove->clas, pMove->birthday, pMove->stu_code, pMove->id_code, pMove->enyear);
        pMove = pMove->next;
    }
}

字符数组初始化一下

char enyear[10]={'\0'};
char birthday[20]={'\0'};
char major[10]={'\0'};
char name[10]={'\0'};

可能你某个字符串定义的长度不足