入门问题!成绩录入学号正常但结果是学号+姓名

正常输入学号,查询的时候是学号是:学号+姓名,这是为什么?

img

#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';

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7598513
  • 这篇博客你也可以参考下:学生名字排序(指针数组+函数指针)(实参为指针数组和二维数组时,排序的区别)
  • 除此之外, 这篇博客: 双向循环链表实践---学生管理系统中的 创建头节点 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. 创建头指针
    2. 初始化头指针
      1. 分配内存
      2. 自己指向自己
    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;
    }
  • 您还可以看一下 郭宪老师的强化学习深入浅出完全教程课程中的 强化学习概述小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题分析:

    根据问题描述,学号输入正常,但查询结果为学号+姓名,那么可能是在查询结果中加入了姓名的信息,导致输出不符合预期。这可能发生在查询函数中。需要检查查询函数的代码,看是否有将姓名信息加入查询结果的操作。

    解决方案:

    1. 检查查询函数的代码,看是否有将姓名信息加入查询结果的操作。如果有,需要删除该操作。

    2. 如果查询函数没有明显问题,可以考虑在调用查询函数时打印中间结果,看具体是哪一步出现了问题。根据中间结果排查问题。

    3. 如果还是找不到问题,可以考虑重新实现查询函数,确保函数不会将姓名信息加入查询结果中。

    代码展示:

    如果无法查看原有的查询函数的代码,可以尝试以下方式重新实现一个简单的查询函数:

    void search(char* stu_num) { // 假设查询函数的参数为学号,类型为字符串
        // 在数据库中查询学号对应的学生信息,并输出结果
        // 不需要加入姓名信息
    }
    

    在这个查询函数中,不需要将姓名信息加入查询结果中,只需要查询学号对应的学生信息并输出即可。如果有需要可以添加其他查询条件。