正常输入学号,查询的时候是学号是:学号+姓名,这是为什么?
#include <stdio.h>
#include <string.h>
#define N 5
struct student
{
char id[12],name[20],class[25];
int sex,score;
}stu[5];
void inputstudent();
void querystudent();
void deletestudent();
void sortstudent();
int sex;
void inputstudent()
{
{int i=0;
while(i<5){
printf("请输入第%d个学生的信息:\n",i+1);
printf("学号:");
do {
scanf("%s",stu[i].id);
if(strlen(stu[i].id)!=12) {
printf("请重新输入学号共12位!\n");
}
}while(strlen(stu[i].id)!=12);
printf("姓名:");
do {
scanf("%s",stu[i].name);
if(strlen(stu[i].name)>20) {
printf("请重新输入姓名拼音不超过20位!\n");
}
}while(strlen(stu[i].name)>12);
printf("班级:");
do {
scanf("%s",stu[i].class);
if(strlen(stu[i].class)>25) {
printf("请重新输入班级拼音不超过25位!\n");
}
}while(strlen(stu[i].class)>25);
printf("性别(0:女,1:男):");
do {
scanf("%d", &stu[i].sex);
if(stu[i].sex != 0 && stu[i].sex != 1) {
printf("请重新输入性别只能输入0或1!\n");
}
} while(stu[i].sex != 0 && stu[i].sex != 1);
printf("分数:");
do {
scanf("%d",&stu[i].score);
if(stu[i].score<0||stu[i].score>100) {
printf("请重新输入分数应在0~100!\n");
}
}while(stu[i].score<0||stu[i].score>100);
printf("录入成功!\n");i++;}
}
}
void querystudent(){
int i,choice;
char num[12];
char mingzi[20];
printf("请选择你查询成绩方式:\n1.姓名\n2.学号");
scanf("%d",&choice);
if(choice==1){
printf("输入名字:");
scanf("%s",mingzi);{
for(i=0;i<5;i++){
if(strcmp(mingzi,stu[i].name)==0){
printf("姓名:%s\n",stu[i].name);
printf("学号:%s\n",stu[i].id);
printf("班级:%s\n",stu[i].class);
printf("性别:%d\n",stu[i].sex);
printf("C语音成绩:%d\n",stu[i].score);
break;
}
if(strcmp(mingzi,stu[0].name)!= 0&&strcmp(mingzi, stu[1].name) != 0&&strcmp(mingzi, stu[2].name) != 0&&strcmp(mingzi, stu[3].name) != 0&&strcmp(mingzi, stu[4].name) != 0)
{
printf("输入错误,请重新输入\n");}
}}
}
if(choice==2){
printf("输入学号:");
scanf("%s",num);{
for(i=0;i<5;i++){
if(strcmp(num,stu[i].id)==0){
printf("姓名:%s\n",stu[i].name);
printf("学号:%s\n",stu[i].id);
printf("班级:%s\n",stu[i].class);
printf("性别:%d\n",stu[i].sex);
printf("C语音成绩:%d\n",stu[i].score);
break;
}
if(strcmp(num,stu[0].id)!= 0&&strcmp(num, stu[1].id) != 0&&strcmp(num, stu[2].id) != 0&&strcmp(num, stu[3].id) != 0&&strcmp(num, stu[4].id) != 0)
{
printf("输入错误,请重新输入\n");}
}}
}
}
void deletestudent(){
char num[12];
int i=0,j;
printf("请输入你要删除的学生学号:");
scanf("%s",num);
for(i=0;i<5;i++){
if(strcmp(num,stu[i].id)==0){
for(;i<4;i++) {
stu[i]=stu[i+1];
}
i--;
printf("删除成功!\n");
return;
}
}
printf("没有找到该学生的信息!\n");
}
void sortstudent(){
struct student temp;
int i=0,j=0;
for(i=0;i<5;i++){
for(j=0;j<4-i;j++){
if(stu[j].score<stu[j+1].score)
{
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
printf("成绩从高到低排序为:\n");
for(i=0;i<5;i++){
printf("%s %d\n",stu[i].name,stu[i].score);
}
}
int main()
{
while(1){
printf("欢迎来到学生成绩管理系统!\n");
printf("1.录入学生信息与成绩\n");
printf("2.查询学生信息与成绩\n");
printf("3.删除学生信息与成绩\n");
printf("4.排序学生信息与成绩\n");
printf("\n请选择您要进行的功能(1~4):\n");
int num=0;
scanf("%d",&num);
switch(num)
{
case 1:inputstudent();
break;
case 2:querystudent();
break;
case 3:deletestudent();
break;
case 4:sortstudent();
break;
} printf("是否还要继续操作?(yes=1/no=2)");
scanf("%d",&num);
if(num==2) {
break;}
}
return 0;
}
因为学号的长度为 12 ,id[12] 默认应该只能存长度为11的数,因为最后一个应该存 \0 ,因为超了,结构体内id和姓名又是连续的内存,字符串打印遇到 \0 才会终止,所以把后边的名字也一起打印了才终止。
要么把 id[12] 改成 id[13],要么限制,只能拷贝11 个字符进 id,学号最后一个字符id[11] 设置为 '\0';
struct student *head = NULL;
/*create head node*/
void init(void)
{
printf("%s\n", __func__);
head = (struct student *)malloc(sizeof(struct student));
head->next = head;
head->prev = head;
}
问题分析:
根据问题描述,学号输入正常,但查询结果为学号+姓名,那么可能是在查询结果中加入了姓名的信息,导致输出不符合预期。这可能发生在查询函数中。需要检查查询函数的代码,看是否有将姓名信息加入查询结果的操作。
解决方案:
检查查询函数的代码,看是否有将姓名信息加入查询结果的操作。如果有,需要删除该操作。
如果查询函数没有明显问题,可以考虑在调用查询函数时打印中间结果,看具体是哪一步出现了问题。根据中间结果排查问题。
如果还是找不到问题,可以考虑重新实现查询函数,确保函数不会将姓名信息加入查询结果中。
代码展示:
如果无法查看原有的查询函数的代码,可以尝试以下方式重新实现一个简单的查询函数:
void search(char* stu_num) { // 假设查询函数的参数为学号,类型为字符串
// 在数据库中查询学号对应的学生信息,并输出结果
// 不需要加入姓名信息
}
在这个查询函数中,不需要将姓名信息加入查询结果中,只需要查询学号对应的学生信息并输出即可。如果有需要可以添加其他查询条件。