You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

密码验证逻辑异常:输入无效密码却跳转encrypt_decrypt函数问题排查

问题分析与修复

你的代码核心问题是搞反了strcmp函数的返回值逻辑,同时存在变量赋值错误,导致验证逻辑完全错位:

  • strcmp(a, b)返回0时表示两个字符串相等,返回非0时表示不相等。

具体错误点:

  1. 用户名判断逻辑颠倒:
    原代码if (strcmp(usr.username, username))是在用户名不相等时进入分支,实际应该是用户名相等时才检查密码,需改为if (!strcmp(usr.username, username))。

  2. 密码判断逻辑颠倒:
    原代码在密码不相等时执行encrypt_decrypt(),密码相等时反而提示「Invalid Password!」,完全和期望逻辑相反。

  3. 变量赋值错误:
    调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:20:15