C语言 输出时多显示了一个数据

图片说明
图片说明
第一步输入完数据后 然后退出进行第五步输出数据时 学号输出的时候还附带了姓名(就是本来应该只输出学号却还多输出了名字) 不知道为什么?

源代码如下
#include
#include
#include
#include

int bExit = 0;
int total = 0;
#define Create(the_one) the_one=(Stu *)malloc(sizeof(Stu))
typedef
struct Student
{

char num[12];      // 数字学号
char name[20]; // 姓名
char sex[5];     // 性别
char telnum[11];    // 电话号码
struct Student *next;

}Stu;
Stu *the_one, *h, *pr,*last, *end;

//1.添加学生函数
void ADD()
{
int Four = 0;
printf("================================\n");

Create(the_one);
the_one->next = NULL;
 end = last;          //end指向倒数第二个结点

last->next = the_one;//将the_one放在链表的 最后
last = the_one;      //last指向倒数第一个结点 



//输入学号
printf("输入学生信息:\n12位学号:");

while (!Four)
{
    gets(the_one->num);
    if (strlen(the_one->num) != 12)
        printf("输入非法:学号必须是12位,请重新输入!\n学号:");
    else
        Four = 1;
}


//输入姓名
printf("学生姓名:");
gets(the_one->name);
//输入电话号码
printf("学生电话号码(11位):");
 gets(the_one->telnum);
 //请输入性别
 printf("请输入性别(填写男或女): ");
 gets(the_one->sex);

//总数+1
total++;
 printf("================================\n");

}

//2.查询学生函数
void CHECK()
{
Stu *target, *p;
int fond = 0;
printf("================================\n");
printf("输入要查找学生的学号:\n学号:");
Create(target);
gets(target->num);
for (p = h->next; p; p = p->next)
{
if (!strcmp(p->num, target->num))
{
printf("学号为%s的学生信息:姓名(%s),性别(%s),电话号码(%s)\n", p->num, p->name,p->sex, p->telnum);
free(target);
fond = 1;
}
}
if (!fond)
printf("Wrong Student NO.!\n");
printf("================================\n");
}
//3.编辑学生
void EDIT()
{
Stu *target, *p;
int fond = 0;
printf("================================\n");
printf("输入要编辑学生的学号:\n学号:");
Create(target);
gets(target->num);
for (p = h->next; p; p = p->next)
{
if (!strcmp(p->num, target->num))
{
printf("学号为%s的学生信息:姓名(%s),性别(%s),电话号码(%s)\n", p->num, p->name,p->sex, p->telnum);
printf("请选择修改项目:\n1:姓名\n2:电话号码\n");
char c;
c = getch();
switch (c)
{
case '1':
printf("输入正确的姓名:");
gets(p->name);
break;
case '2':
printf("输入最新电话号码:");
gets(p->telnum);
break;
}
printf("学号为%s的学生最新信息:姓名(%s),性别(%s),电话号码(%s)\n", p->num, p->name,p->sex, p->telnum);

        free(target);               // ??
        fond = 1;
    }
}
if (!fond)
    printf("Not Exit This NO.!\n");
printf("================================\n");

}
//4.删除学生
void DELETE1()
{
void PRINALL();
PRINALL();
Stu *target, *p, *pr;
int fond = 0;
printf("================================\n");
printf("输入要删除学生的学号:(如果删除所有学生信息,请输入0000)\n学号:");
Create(target);
gets(target->num);

//  char *zero=&"0000";

if (!strcmp(target->num, "0000"))
{
    h->next = NULL;
    total = 0;
}
else
{

    for (pr = h, p = h->next; p; pr = pr->next, p = p->next)
    {
        if (!strcmp(p->num, target->num))
        {
            printf("学号为%s的学生信息已删除\n", p->num);
            free(target);
            pr->next = p->next;
            p->next = NULL;
            //               free(p);此句报错
            fond = 1;
            total--;
        }
    }
    if (!fond)
        printf("没有找到学号为%s的学生,请确认学号输入是否正确\n");
}
printf("================================\n");

}
//5.打印全部
void PRINALL()
{
int amounts = 1;
Stu *ap;
printf("================================\n");
printf("所有学生信息:\n");
for (ap = h->next; ap; ap = ap->next)

printf("%d,%s,%s,%s,%s\n",amounts++,ap->name,ap->num,ap->sex,ap->telnum);
printf("================================\n");
}
//6.总人数
void TOTAL()
{
printf("================================\n");
printf("学生总人数:%d\n", total);
printf("================================\n");
}

//菜单函数
void Menu()
{
char order;
printf("================================\n");
printf("| 1.添加学生. |\n");
printf("| 2.查询学生. |\n");
printf("| 3.编辑学生. |\n");
printf("| 4.删除学生. |\n");
printf("| 5.打印全部. |\n");
printf("| 6.总人数. |\n");
printf("| 7.退出. |\n");
printf("================================\n");

order = getch();
system("cls");


switch (order)
{
case '1':
    ADD();
    break;
case '2':
    CHECK();
    break;
case '3':
    EDIT();
    break;
case '4':
    DELETE1();
    break;
case '5':
    PRINALL();
    break;
case '6':
    TOTAL();
    break;
case '7':
    bExit = 1;
    break;
}
while (!bExit)
{
    getch();
    system("cls");
    Menu();
}

}
void main()
{
//创建链表头
Create(h);
pr = last = end = the_one = h;
the_one->next = NULL;

Menu();

}

1个回答

字符串长度需要比你实际用到的长度+1
比如你char num[12],学号只能11位,否则会把结尾的\0冲掉,导致和后面的姓名连成一个字符串。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐