void Student(struct student stu[N]) { int n = 0,sum=N; FILE* fp = fopen("D:666.txt", "r"); struct student *p = stu; char num1[13], pass1[10]; char num[13], pass[10]; int login_success = 0; while (!login_success) { input: printf("请输入学号:"); scanf("%s",&num); printf("请输入密码:"); scanf("%s",&pass); if(strcmp(num1, num) == 0 && strcmp(pass1, pass) == 0){ printf("登录成功!\n"); login_success = 1; break; } } if (!login_success) { printf("你输入错误,请重新输入!\n"); } fclose(fp);优化函数
时间: 2024-03-16 18:42:15 浏览: 100
这段代码存在几个问题:
1. 在读取文件之前就关闭了文件指针,导致无法读取文件内容。
2. 在输入用户名和密码时,没有对输入的字符串进行长度判断,可能导致越界。
3. 在比较用户名和密码时,用的是未初始化的变量,导致比较结果不可预测。
以下是优化后的代码:
```c
void Student(struct student stu[N]) {
int n = 0, sum = N;
FILE* fp = fopen("D:666.txt", "r");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
struct student* p = stu;
char num[13], pass[10];
int login_success = 0;
while (!login_success) {
printf("请输入学号:");
scanf("%12s", num);
printf("请输入密码:");
scanf("%9s", pass);
rewind(fp); // 将文件指针移回文件开头
while (fscanf(fp, "%s %s", p->num, p->pass) == 2) {
if (strcmp(p->num, num) == 0 && strcmp(p->pass, pass) == 0) {
printf("登录成功!\n");
login_success = 1;
break;
}
}
if (!login_success) {
printf("你输入错误,请重新输入!\n");
}
}
fclose(fp);
}
```
在优化后的代码中,我们:
1. 在打开文件之后,先判断是否打开成功,如果失败则直接返回。
2. 在输入学号和密码时,使用 `%12s` 和 `%9s` 格式控制符,限制输入字符串的长度,避免越界。
3. 在比较用户名和密码时,使用已定义并初始化的结构体变量 `struct student* p`,避免了使用未初始化变量的问题。
4. 在比较用户名和密码时,每次比较前,将文件指针移回文件开头,保证每次比较都是从文件开头开始,避免漏掉某些记录。
阅读全文