第5的修改功能运行不了,是哪里错误。和添加什么实现第1的输入功能

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int n=0;
typedef struct student
{
    char sno[12];
    char name[8];
    int old;
    int high;
    int weight;
} stud;

void input(stud*b);
void output(stud*b);
void insert(stud*b,int j);
int find (stud*b);
void readfile(stud*b,FILE*fp);
void savefile(stud*b,FILE*fp);
int del(stud*b);
void display(stud*b);
void add_stu(stud*b);
void menu();
void modify(stud*b);

int main()
{
    system("color 31");
    FILE *fp;
    stud stu[50];
    char user[10],ps[7];
    int choice,j;
    printf("\n");
    printf("请输入用户名:\n");
    gets(user);
    printf("请输入密码:\n");
    j=0;
    while((ps[j]=getch())!='\r')
    {
        printf("*");
        j++;
    }
    ps[j]='\0';
    printf("\n");
    if((strcmp(user,"admin")==0)&&(strcmp(ps,"123")==0))
    {


    while(1)
    {
        system("cls");
        menu();
        printf("输入选择:\n");
        scanf("%d",&choice);
         switch(choice)
        {
            case 1:if((fp=fopen("stu_list","r"))==NULL){
            printf("文件不存在");}

            else
             readfile(stu,fp); system("pause");break;

            case 2:add_stu(stu);system("pause");break;
            case 3:getchar();
             j=find(stu);
             if(j==-1)printf("查无此人!\n");
             else
          {
              printf("该同学信息是");
              output(stu+j);}system("pause");break;
            case 4:fflush(stdin);j=del(stu);
             if(j==-1)printf("查无此人!\n");
             else
       {
           printf("删除成功\n");
           display(stu);}system("pause");break;
            case 5:fflush("stdin");modify(stu);system("pause");break;
            case 6:savefile(stu,fp);system("pause");break;
            case 7:display(stu);system("pause");break;
            case 0:exit(1);break;
               default: printf("输入有误\n");system("pause");
        }
    }
    }
    else printf("用户名或密码错误,无法登录\n");
    return 0;
}
void menu()
{
    printf("\n\n\n");
    printf("\t\t\t|#||#||#||#||#||#||#||#||#||#||#||#||#||#|\n");
    printf("\t\t\t|#|       1------信息加载              |#|\n");
    printf("\t\t\t|#|       2------添加记录              |#|\n");
    printf("\t\t\t|#|       3------信息查询              |#|\n");
    printf("\t\t\t|#|       4------删除记录              |#|\n");
    printf("\t\t\t|#|       5------信息修改              |#|\n");
    printf("\t\t\t|#|       6------信息保存              |#|\n");
    printf("\t\t\t|#|       7------信息浏览             |#|\n");
    printf("\t\t\t|#|       0------退出                  |#|\n");
    printf("\t\t\t|#||#||#||#||#||#||#||#||#||#||#||#||#||#|\n");
}


void readfile(stud*b,FILE*fp)//读文件
{  int j=0;
       if((fp=fopen("stu_list","r"))==NULL)
    {
        printf("Error opening file !\n");
        exit(1);
       }
       while(!feof(fp))//判断是否读到文件尾
    {
        fread(b+j,sizeof(stud),1,fp);
        j++;
    }
   fclose(fp);
    n=j-1;
}

void savefile(stud*b,FILE*fp)//保存文件
{
    if((fp=fopen("stu_list","w"))==NULL)
    {
        printf("Error opening file !\n");
        exit(1);
    }
    fwrite(b,sizeof(stud),n,fp);
     fclose(fp);
}

void input(stud *b)
{
    scanf("%s%s%d%d%d",b->name,b->sno,&b->old,&b->high,&b->weight);
}
void output(stud *b)
{
   scanf("%-8s%-8s%5d%5d%5d\n",b->name,b->sno,b->old,b->high,b->weight);
}

void display(stud *b)
{
    int j;
    printf("全部学生的信息:\n");
     printf("%-8s%-8s%-8s%-8s%-8s\n","姓名","学号","年龄","身高","体重");
      for(j=0; j<n; j++)
        output(b+j);
}

void insert(stud*b,int j)
{
    stud snew;int k;
    printf("请输入新同学的信息:\n");
    input(&snew);
    for(k=n-1;k>=j-1;k--)*(b+k+1)=*(b+k);
    *(b+j-1)=snew;
    n++;
}
void add_stu(stud *p)
{
    stud snew;
    char ch='Y';
    while(1)
    {
        if(ch=='Y'||ch=='y')
        {
              printf("请输入新同学的信息:\n");
              input(&snew);
              *(p+n)=snew;
               n++;
        }
        else if(ch=='N'||ch=='n')break;
        printf("是否继续录入?是请输入Y或y,否请输入N或n\n");
        getchar();
        ch=getchar();
    }

}

int find(stud *b)
{
    char name[8];
    int j;
    printf("请输入要查找的学生姓名:\n");
    gets(name);
    for(j=0; j<n; j++)
        if(strcmp((b+j)->name,name)==0)
            return j;
            return -1;
}

int del(stud *b)
{
    char name[8];
    int j,k;
     printf("请输入要删除的学生姓名:\n");
     gets(name);
     for(j=0; j<n; j++)
        if(strcmp((b+j)->name,name)==0)
     {
         for(k=j;k<n;k++)*(b+k)=*(b+k+1);
         n--;
         return 1;
     }
     return -1;
}
void modify(stud *b)
{
    char name[8];
    int j;
     printf("请输入要修改的学生姓名:\n");
      gets(name);
       for(j=0; j<n; j++)
        if(strcmp((b+j)->name,name)==0)
       {
            printf("该同学原来的信息是:\n");
            output(b+j);
            printf("请输入新的姓名:\n");
            gets((b+j)->name);
            printf("请输入新的学号:\n");
            gets((b+j)->sno);
            printf("请输入新的年龄:\n");
            gets((b+j)->old);
            printf("请输入新的身高:\n");
            gets((b+j)->high);
            printf("请输入新的体重:\n");
            gets((b+j)->weight);
            printf("修改成功!\n");
            break;
       }
       if(j==n)printf("此人不存在\n");

}
 

第5个修改功能无法运行的问题出现在这儿:

fflush("stdin");

应该将"stdin"更正为stdin,即去掉双引号。fflush(stdin)用于清空输入缓冲区,但是在标准C中,刷新stdin是未定义行为,所以应该避免使用。
以下是对第1个输入功能的修改建议:
1、在输入用户名和密码时,使用scanf函数代替gets函数,因为gets函数存在缓冲区溢出的风险。
2、使用fgets函数代替scanf函数来读取字符串,以避免输入超过指定长度的字符。
3、为了避免输入密码时显示明文,可以使用第三方库提供的函数来实现密码的隐藏效果,例如getpass函数。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <conio.h>

int main()
{
    system("color 31");
    FILE *fp;
    stud stu[50];
    char user[10], ps[7];
    int choice, j;
    printf("\n");
    printf("请输入用户名:\n");
    scanf("%s", user);
    printf("请输入密码:\n");
    strcpy(ps, getpass("")); // 使用getpass函数隐藏密码输入

    printf("\n");
    if ((strcmp(user, "admin") == 0) && (strcmp(ps, "123") == 0))
    {
        // ...
    }
    else
    {
        printf("用户名或密码错误,无法登录\n");
    }
    return 0;
}

修改后的代码使用了stdbool.h头文件,并引入了getpass函数来隐藏密码输入。