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

C语言多账户登录密码比对失败问题求助

问题排查与解决方案

核心问题定位

你遇到的登录验证失败,本质是C语言字符串比较方式错误:C语言中字符串是字符数组,直接用==比较的是数组的内存地址而非内容——哪怕密码内容完全一致,两个数组的地址也不同,所以永远无法匹配成功,导致直接走到“Account not found”分支。

具体修复步骤

1. 替换字符串比较逻辑

把登录函数中密码比对的==换成<string.h>头文件提供的strcmp函数,该函数会逐字符比较字符串内容,返回0时表示内容完全一致。
修复后的核心代码片段:

// 必须先引入头文件
#include <string.h>

// 登录函数内的比对逻辑
for (int i = 0; i < account_count; i++) {
    // 先匹配账号
    if (strcmp(accounts[i][0], input_account) == 0) {
        // 再匹配密码
        if (strcmp(accounts[i][4], input_password) == 0) {
            printf("Welcome!\n");
            return i; // 返回登录成功的账户索引,供后续查询使用
        } else {
            printf("Incorrect password!\n");
            return -1;
        }
    }
}
printf("Account not found\n");
return -1;

2. 排除输入缓冲区干扰

如果注册或登录时用scanf读入内容后,缓冲区残留了换行符,可能导致后续读入的密码包含无效字符。可以在每次scanf后调用getchar()清空缓冲区,或者确保用scanf("%s", ...)读取字符串(%s会自动跳过空白字符)。

3. 验证密码存储正确性

注册完成后,直接打印accounts[i][4]的内容,确认输入的密码确实被完整存入数组,排除存储阶段的错误。

额外注意事项

  • 确保存储密码的数组维度足够,避免输入过长密码导致缓冲区溢出。
  • 如果用fgets读取字符串,记得手动移除末尾的换行符(fgets会把换行符也读入字符串):
fgets(input_password, sizeof(input_password), stdin);
input_password[strcspn(input_password, "\n")] = '\0';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:29:51