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
相关产品推荐
相关产品推荐

