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

C语言注册登录系统输入正确账号密码仍提示不匹配问题排查

登录校验失败问题排查与修复方案

存在的问题

  • 注册环节密码未写入待持久化的结构体:注册时用户输入的密码存储到了局部变量p1.password中,但最终写入文件的是u1结构体,u1.password始终是未初始化的随机值,导致登录校验时永远匹配失败
  • 结构体定义错误:struct information中的age字段错误定义为长度20的int数组int age[20],实际应为单个int变量,错误的结构体定义会导致内存布局错位,读写文件时所有字段的偏移都出现异常
  • 文件关闭逻辑错误:登录校验的while(fread)循环内部直接调用fclose(fp),第一次循环执行后就会关闭文件,无法遍历所有注册用户,即使后续有匹配的账户也无法读到
  • 输入溢出隐患:address字段长度为50,但scanf限制为%19s,虽不直接导致登录失败,但属于明显的边界错误
  • 无校验失败分支逻辑:当前代码匹配失败后无任何提示,用户无法感知是校验失败还是程序无响应

修复方案

第一步:修正结构体定义

struct information
{
    char username[20];
    char password[20];
    int date, month, year;
    char pnumber[20];
    int age; // 修正为单个int,不是数组
    char fname[20];
    char lname[20];
    char fathname[20];
    char mothname[20];
    char address[50];
};

第二步:修正注册环节密码存储逻辑

删掉无用的p1局部变量,密码直接写入u1.password:

// 原代码 scanf("%19s", p1.password); 替换为下面的代码
printf("\nPASSWORD..");
scanf("%19s", u1.password); // 直接写入u1的password字段,后续写入文件才会带密码

第三步:修正登录环节文件关闭逻辑和校验分支

int login_success = 0;
// 校验用户名密码是否存在
while (fread(&u1, sizeof(u1), 1, fp))
{
    if (strcmp(username, u1.username) == 0 && strcmp(password, u1.password) == 0)
    {
        login_success = 1;
        break; // 匹配到直接跳出循环
    }
}
fclose(fp); // 移到循环外,遍历完所有用户再关闭文件

if(login_success) {
    mainmenu();
} else {
    printf("\n用户名或密码错误,请重试\n");
    // 此处可补充重试跳转逻辑
}

第四步:修复地址输入的长度限制

// 原代码 scanf("%19s", u1.address); 替换为
scanf("%49s", u1.address); // 和address字段长度匹配,预留字符串终止符位置

内容的提问来源于stack exchange,提问作者root1_2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:45:07