王新港 2017-06-03 13:28 采纳率: 100%
浏览 2361
已采纳

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条回答

  • threenewbee 2017-06-03 16:08
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择