void Student(struct student stu[N]){ int i,n=0; struct student *p; p=stu; char num1[]="2021110300236"; char pass1[]="123456"; input:printf("请输入学号:"); char num[13]; scanf("%s",&num); printf("请输入密码:"); char pass[10]; scanf("%s",&pass); for(i=0;i<sum;i++) { //printf("%d\n%s\t%s\n%s\t%s\n",i,num,pass,stu[i].num,stu[i].pass); if(strcmp(num1,num)==0 && strcmp(pass1,pass)==0){ Sid=i; break; } } if(i==sum){ printf("你输入错误,请重新输入!\n"); goto input; } while(n<5) {printf("请选择(0-4): "); scanf("%d",&n); switch(n) { case 1: Register(p); break; case 2: LookUpdatePersonal(p);break; case 3: DormitoryCnd(p); break; case 4: system("cls");Print_Map();break; case 0: n=5;break; } } }优化这个代码
时间: 2024-03-14 09:46:29 浏览: 55
这段代码可以进行如下优化:
1. 将 `input` 标签和 `goto` 语句替换为 `while` 循环和 `break` 语句,避免使用 `goto` 语句。
2. 使用 `fgets` 函数代替 `scanf` 函数,以避免缓冲区溢出的问题。
3. 使用 `strcmp` 函数比较字符串时,应该将常量字符串放在前面,以提高效率。
4. 使用 `const` 修饰常量字符串参数,以增加代码的可读性和安全性。
5. 在 `switch` 语句中加上 `default` 标签,处理无效的输入。
6. 增加一些注释,以增加代码的可读性。
改进后的代码如下:
```c
void Student(struct student stu[N]) {
int i, n = 0;
struct student *p = stu;
const char num1[] = "2021110300236";
const char pass1[] = "123456";
char num[13], pass[10];
while (1) {
printf("请输入学号:");
fgets(num, sizeof(num), stdin);
printf("请输入密码:");
fgets(pass, sizeof(pass), stdin);
// 去除 num 和 pass 的换行符
num[strcspn(num, "\n")] = '\0';
pass[strcspn(pass, "\n")] = '\0';
for (i = 0; i < sum; i++) {
if (strcmp(num1, num) == 0 && strcmp(pass1, pass) == 0) {
Sid = i;
break;
}
}
if (i == sum) {
printf("你输入错误,请重新输入!\n");
} else {
break;
}
}
while (n < 5) {
printf("请选择(0-4): ");
scanf("%d", &n);
switch (n) {
case 1:
Register(p);
break;
case 2:
LookUpdatePersonal(p);
break;
case 3:
DormitoryCnd(p);
break;
case 4:
system("cls");
Print_Map();
break;
case 0:
n = 5;
break;
default:
printf("无效的输入,请重新选择!\n");
break;
}
}
}
```
阅读全文