void xgxsxx(struct xsyhxx xinxi[N]){ FILE *fp; char i[10]; int j=0,y,n,m; input:printf("请输入修改该学生信息的相应学号:"); scanf("%s",&i);for(y=0;y<x;y++){ if(strcmp(xinxi[y].xsxh,i)==0){ printf("该学生信息如下: \n 学号,姓名, 性别,身份证号,密码,报到,宿舍,班级,\n"); printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", xinxi[y].xsxh,xinxi[y].xsname,xinxi[y].xssex,xinxi[y].xs,xinxi[y].xspassword,xinxi[y].xsbd,xinxi[y].xsss,xinxi[y].xsbj,xinxi[y].xszy); break;优化代码
时间: 2024-03-20 19:43:05 浏览: 13
可以将输入学号的部分修改为使用gets函数,避免使用scanf函数可能产生的缓冲区溢出问题。并且可以将循环中的字符串比较改为使用strcmp函数的返回值直接作为判断条件,避免使用if语句。修改后的代码如下:
```c
void xgxsxx(struct xsyhxx xinxi[N]){
FILE *fp;
char i[10];
int j=0,y,n,m;
printf("请输入修改该学生信息的相应学号:");
gets(i);
for(y=0;y<x;y++){
if(!strcmp(xinxi[y].xsxh, i)){
printf("该学生信息如下: \n 学号,姓名, 性别,身份证号,密码,报到,宿舍,班级,\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
xinxi[y].xsxh, xinxi[y].xsname, xinxi[y].xssex, xinxi[y].xs,
xinxi[y].xspassword, xinxi[y].xsbd, xinxi[y].xsss, xinxi[y].xsbj, xinxi[y].xszy);
break;
}
}
}
```
相关问题
#include<stdlib.h> #define N 10 typedef struct { char no[15]; char name[10]; float score[3]; float aver; }STU; void Input_Info(STU a[], int n) { /********** Begin **********/ for(int i=0; i<n; i++) { scanf("%s%s", a[i].no, a[i].name); for(int j=0; j<3; j++) { scanf("%f", &a[i].score[j]); a[i].aver+=a[i].score[j]/3; } } /********** End **********/ } void Write_Info(STU a[], int n){ /********** Begin **********/ FILE *fp; fp=fopen("record", "a"); if(fp==NULL) { printf("不能打开文件!\n"); exit(0); } fwrite(a, sizeof(STU), n, fp); fclose(fp); /********** End **********/ }哪里错了
这段代码存在一些问题:
1. 在 `Input_Info` 函数中,`aver` 没有被初始化为0,导致平均分计算不正确。
2. 在 `Write_Info` 函数中,使用了 `fwrite` 将结构体数组写入文件,但结构体中包含指针类型的成员,无法正确地写入文件。
建议使用 `fprintf` 函数将结构体成员逐个写入文件,例如:
```
void Write_Info(STU a[], int n) {
FILE *fp;
fp = fopen("record", "a");
if (fp == NULL) {
printf("不能打开文件!\n");
exit(0);
}
for (int i = 0; i < n; i++) {
fprintf(fp, "%s %s %.2f %.2f %.2f %.2f\n", a[i].no, a[i].name, a[i].score[0], a[i].score[1], a[i].score[2], a[i].aver);
}
fclose(fp);
}
```
另外,建议在函数中添加一些错误处理机制,例如对文件打开失败进行处理等。
void xslogin(struct xsyhxx xinxi[],int c){ struct xsyhxx *p; p = xinxi; int n=0; char xszh[]="2021110300236"; char xsmima[]="123123123"; printf("请输入学生的账号(默认为学号): "); char xs[15]; scanf("%s",&xs); printf("请输入学生的密码: "); char xmima[6]; scanf("%s",&xmima); if(strcmp(xszh,xs)==0){ if(strcmp(xsmima,xmima)==0){ printf("登录成功\n"); return; }else;printf("你输入错误,请重新输入! \n"); } else;printf("你输入错误,请重新输入! \n"); } void glylogin(struct xsyhxx xinxi[],int c){ struct xsyhxx *p; p = xinxi; int n=0; char glyzh[]="999999"; char glymima[]="123123123"; printf("请输入管理员专属账号: "); char gly[10]; scanf("%s",&gly); printf("请输入管理的密码: "); char mima[6]; scanf("%s",&mima); if(strcmp(glyzh,gly)==0){ if(strcmp(glymima,mima)==0){ printf("登录成功\n"); return; }else;printf("你输入错误,请重新输入! \n"); } else;printf("你输入错误,请重新输入! \n"); } int login(int f){ struct xsyhxx xinxi[100]; int c=0; do{printf("请你选择你的身份进入系统:"); scanf("%d",&f); switch(f){ case 1: glylogin(xinxi,c);break; case 2: xslogin(xinxi,c);break; default:printf("无效选择\n");break; } }while(f!=0); return 0; }优化代码
以下是优化后的代码:
```
void xslogin(struct xsyhxx xinxi[], int c) {
struct xsyhxx *p = xinxi;
char xszh[] = "2021110300236";
char xsmima[] = "123123123";
char xs[15], xmima[6];
printf("请输入学生的账号(默认为学号): ");
scanf("%s", xs);
printf("请输入学生的密码: ");
scanf("%s", xmima);
if (strcmp(xszh, xs) == 0 && strcmp(xsmima, xmima) == 0) {
printf("登录成功\n");
} else {
printf("你输入错误,请重新输入!\n");
xslogin(xinxi, c); // 递归调用自己,重新输入
}
}
void glylogin(struct xsyhxx xinxi[], int c) {
struct xsyhxx *p = xinxi;
char glyzh[] = "999999";
char glymima[] = "123123123";
char gly[10], mima[6];
printf("请输入管理员专属账号: ");
scanf("%s", gly);
printf("请输入管理的密码: ");
scanf("%s", mima);
if (strcmp(glyzh, gly) == 0 && strcmp(glymima, mima) == 0) {
printf("登录成功\n");
} else {
printf("你输入错误,请重新输入!\n");
glylogin(xinxi, c); // 递归调用自己,重新输入
}
}
int login(int f) {
struct xsyhxx xinxi[100];
int c = 0;
do {
printf("请你选择你的身份进入系统:");
scanf("%d", &f);
switch (f) {
case 1:
glylogin(xinxi, c);
break;
case 2:
xslogin(xinxi, c);
break;
default:
printf("无效选择,请重新输入!\n");
break;
}
} while (f != 0);
return 0;
}
```
优化后的代码主要针对两个函数进行了修改:
- 在输入账号和密码时,直接声明变量并输入,避免了使用不必要的指针。
- 在输入错误时,使用递归调用自己的方式重新输入,避免了使用不必要的循环。
另外,对于无效选择的情况,也进行了相应的优化,给出了提示信息并重新输入身份选择。