使用fscanf读取文本文件异常,登录验证失败求助
登录验证失败问题排查与修复
你遇到的核心问题是代码存在多处指针传参、循环逻辑错误,导致fscanf读取内容异常,登录验证失效。先看你的原代码和文本文件内容:
原代码
case 1:; char username[50]; char password[50]; char nameCheck[50]; char pwordCheck[50]; FILE *fp; fp = fopen("AdminLogin.txt", "rb"); rewind(fp); printf("Enter your username: "); scanf("%s", &username); printf("Enter your password: "); scanf("%s", &password); while (Admin == false) { fscanf(fp, "%s %s ", &nameCheck, &pwordCheck); printf("%s %s ", &nameCheck, &pwordCheck); if (strcmp(username, nameCheck) == 0 && strcmp(password, pwordCheck) == 0) { printf("Login successful!\n"); bool Admin = true; break; } else { printf("Login failed.\n"); } fclose(fp); break; } }
文本文件内容
John@gmail.com 1234567 George@gmail.com 1299123
错误点分析
- 数组传参错误:C语言中数组名本身就是指向首元素的指针,
scanf、fscanf、printf传数组时不需要加&。加&后传递的是数组的二级指针,会导致内存读写混乱,这就是printf显示“流而非字符串”的直接原因。 - 文件打开模式错误:用
"rb"二进制模式打开文本文件,会导致换行符等文本格式处理异常,应该用"r"文本模式。 - 循环逻辑完全错误:
- 循环内只读取一行就执行
fclose(fp)和break,根本没机会检查第二行的账号; - 验证成功时定义了局部变量
bool Admin = true;,这会屏蔽外部的Admin变量,导致循环外的Admin状态不会改变;
- 循环内只读取一行就执行
- 未检查文件打开结果:如果文件不存在或权限不足,
fopen会返回NULL,后续操作会直接崩溃。
修复后的代码
#include <stdio.h> #include <string.h> #include <stdbool.h> bool Admin = false; // 假设Admin为外层已定义的变量 int main() { int choice = 1; switch(choice) { case 1: { char username[50]; char password[50]; char nameCheck[50]; char pwordCheck[50]; FILE *fp = fopen("AdminLogin.txt", "r"); if (fp == NULL) { printf("Failed to open file!\n"); break; } printf("Enter your username: "); scanf("%s", username); printf("Enter your password: "); scanf("%s", password); // 遍历文件所有行查找匹配项 while (fscanf(fp, "%s %s", nameCheck, pwordCheck) == 2) { printf("Checking: %s %s\n", nameCheck, pwordCheck); if (strcmp(username, nameCheck) == 0 && strcmp(password, pwordCheck) == 0) { printf("Login successful!\n"); Admin = true; break; } } if (!Admin) { printf("Login failed.\n"); } fclose(fp); break; } } return 0; }
修复说明
- 所有数组传参去掉
&,确保传递正确的首元素地址; - 改用
"r"模式打开文本文件,适配文本格式处理; - 调整循环逻辑:用
fscanf返回值判断是否成功读取一行(返回2表示成功读取两个字符串),遍历所有行直到找到匹配项或文件结束; - 验证成功时直接修改外部Admin变量,避免局部变量屏蔽;
- 增加文件打开失败检查,增强程序健壮性;
- 将文件关闭操作移到循环结束后,确保所有行都能被读取。
内容的提问来源于stack exchange,提问作者Paranoid Android
相关产品推荐
相关产品推荐

