C语言实现基于文件比对的登录系统相关问题求助
核心错误原因
fscanf返回值判断错误:你新增第二个%s格式符后,fscanf成功读取两个字段时会返回2,原判断条件==1永远不成立,循环不会执行,比对自然失效- 输入内容带多余换行符:
fgets读取用户输入时会把末尾的\n也存入字符串,而fscanf的%s会自动跳过空白符,导致两边字符串strcmp永远匹配失败 - 变量赋值逻辑错误:匹配分支中
valid == 0是相等判断而非赋值,且逻辑反向:初始valid=0代表未匹配,匹配成功应该设为valid=1,最后判断valid==0才是未找到记录 - 语法规范问题:标准C中
main函数返回值应为int,而非void
修复后可正常运行的代码
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> struct CustomerDetails // Structure declaration { char fname[100]; char pass[100]; }s; int main() { FILE* login; login = fopen("login.txt", "r"); char fname[100],pass[100]; int valid = 0; // validate whether file can be opened. if (login == NULL) { printf("Could not open file"); exit(0); } printf("Please enter your Full Name and Password to search your booking detail.\n"); printf("\nFull Name: "); fgets(fname, 100, stdin); // 去掉fgets读取的末尾换行符 fname[strcspn(fname, "\n")] = '\0'; printf("Password: "); fgets(pass, 100, stdin); pass[strcspn(pass, "\n")] = '\0'; // 修改返回值判断为2 while (fscanf(login,"%s %s",s.fname,s.pass) == 2) { if (strcmp(fname,s.fname) == 0 && strcmp(pass, s.pass) == 0) { // 修正赋值逻辑 valid = 1; printf("\nRecord Found!"); printf("\nFull Name: %s\n", s.fname); printf("\nPassword: %s\n", s.pass); break; } } // 修正判断逻辑 if (valid == 0) { printf("\nRecord not found!\n"); } fclose(login); return 0; }
其他实现方案
- 更稳定的比对方案:优先用
fgets逐行读取文件内容,再用sscanf拆分每行的姓名字段和密码字段,避免fscanf遇到格式错乱的行时整个文件读取偏移异常,也方便打印整行原始内容 - 仅比对行首、行尾字符串的实现方法:如果每行有多个字段,先用
strtok按空白符拆分当前行的字符串,第一个拆分得到的token就是行首字符串,循环调用strtok直到返回NULL,最后一次非NULL的结果就是行尾字符串,分别和输入内容比对即可
内容的提问来源于stack exchange,提问作者user16437182
相关产品推荐
相关产品推荐

