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

C#登录程序读取txt存储的账号密码校验失败 无法识别正确凭据

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

现存代码问题

  • 字符串拆分逻辑存在缺陷:当前代码仅按半角空格' '拆分读取到的文件内容,完全没有处理注册写入时产生的回车、换行等不可见空白字符。注册账号写入文件时通常会逐行存储,内容实际格式类似zhangsan 123456\r\nlisi 654321,仅按空格拆分后,部分用户名、密码条目会粘连\r/\n不可见字符,和输入框中获取的纯文本内容做全等对比时必然匹配失败。
  • 数组遍历存在索引越界风险:当前循环终止条件为i < words.Length,当i取到数组最后一位索引时,访问words[i+1]会直接超出数组边界触发异常,异常若被窗体全局捕获未弹出,会直接中断校验流程,走到登录失败的提示分支。
  • 调试代码阻塞流程:代码中预留的Console.Read()会等待控制台输入,WinForm项目默认隐藏控制台窗口,这行代码会直接卡住后续所有校验逻辑,根本执行不到账号密码对比的步骤。
  • 匹配逻辑效率低:匹配到正确账号后没有中断循环,会继续遍历完整个数组做无意义的对比。

修复代码

首先删除调试用的控制台打印、读取代码块,替换文件读取拆分逻辑、修正遍历条件,修复后完整登录校验逻辑如下:

private void LoginButton_Click(object sender, EventArgs e)
{
    if(UsernameLogin.Text=="")
    {
        MessageBox.Show("Please enter your username and try again");
        UsernameLogin.Focus();
        return;
    }
    if(PasswordLogin.Text=="")
    {
        MessageBox.Show("Please enter your password and try again");
        PasswordLogin.Focus();
        return;
    }

    // 按所有空白字符拆分,自动过滤拆分产生的空条目
    string[] words = File.ReadAllText("data.txt")
        .Split(new char[] {' ', '\r', '\n', '\t'}, StringSplitOptions.RemoveEmptyEntries);
    
    bool loginSuccess = false;
    // 步长设为2,成对读取用户名、密码,循环终止到倒数第二个元素避免越界
    for(int i=0; i < words.Length - 1; i += 2)
    {
        // 对比时对两边字符串做首尾去空,避免首尾多余空格影响匹配
        if (UsernameLogin.Text.Trim() == words[i].Trim() && PasswordLogin.Text.Trim() == words[i+1].Trim())
        {
            loginSuccess = true;
            MessageBox.Show("Login successful");
            break; // 匹配成功直接跳出循环,无需继续遍历
        }
    }
    if (!loginSuccess)
        MessageBox.Show("Username or password invalid. Please try again.");
}

额外注意项

需要同步确认注册写入文件的逻辑:写入账号密码时不要在用户名、密码前后插入多余的特殊字符,每组账号密码之间用空格分隔、不同账号之间换行即可,不要额外拼接不可见字符。另外当前明文存储密码存在安全风险,功能跑通后建议改成加盐哈希存储,不要直接落盘明文密码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:51:23