密码验证逻辑异常:输入无效密码却跳转encrypt_decrypt函数问题排查
问题分析与修复
你的代码核心问题是搞反了strcmp函数的返回值逻辑,同时存在变量赋值错误,导致验证逻辑完全错位:
strcmp(a, b)返回0时表示两个字符串相等,返回非0时表示不相等。
具体错误点:
用户名判断逻辑颠倒:
原代码if (strcmp(usr.username, username))是在用户名不相等时进入分支,实际应该是用户名相等时才检查密码,需改为if (!strcmp(usr.username, username))。密码判断逻辑颠倒:
原代码在密码不相等时执行encrypt_decrypt(),密码相等时反而提示「Invalid Password!」,完全和期望逻辑相反。变量赋值错误:
调用takeinput(usr.username)时,把输入的用户名存到了循环内的临时usr结构体中,而非提前定义的username数组,导致后续用户名比较永远不匹配。
修复后的代码:
char username[50], pword[50]; struct user usr; int usrFound = 0; // 必须初始化标记变量 printf("\nEnter your username:\t"); takeinput(username); // 将用户名存入全局的username数组 printf("Enter your password:\t"); takepassword(pword); // 确保该函数把密码存入pword(需对应函数实现调整) fp = fopen("Users.dat", "r"); while (fread(&usr, sizeof(struct user), 1, fp)) { // 找到匹配用户名的用户 if (!strcmp(usr.username, username)) { usrFound = 1; // 密码匹配则进入功能函数 if (!strcmp(usr.password, pword)) { system("cls"); printf("\n\t\t\t\t\t\tWelcome\n"); encrypt_decrypt(); } // 密码不匹配提示错误 else { printf("\n\nInvalid Password!"); } break; // 找到目标用户后直接退出循环,无需继续遍历 } } if (!usrFound) { printf("\n\nUser is not registered!"); } fclose(fp); break;
补充提示:
- 确认
takepassword函数正确接收并存储密码到pword数组,若原函数无参数,需修改函数实现或调用方式。 - 初始化
usrFound为0,避免未初始化变量导致的逻辑异常。
内容的提问来源于stack exchange,提问作者Waliya Khan
相关产品推荐
相关产品推荐

