C++密码校验功能异常求助:短密码仍能成功注册
密码校验器的问题分析与修复
你的代码里有几个关键错误导致校验逻辑失效,下面逐一说明并给出修复方案:
错误点解析
长度校验逻辑完全错误
你写的if (regPassword.length() >= 8 || regPassword.length() <= 20)用了逻辑或||,这意味着只要满足其中一个条件就会进入分支。但任何密码长度要么>=8要么<=20(比如2字符的密码满足<=20),所以这个条件永远为真,等于没做长度校验。正确的应该用逻辑与&&,要求长度同时在8-20之间:if (regPassword.length() >= minLength && regPassword.length() <= maxLength)用赋值运算符代替比较运算符
if (valid = true)和else if (valid = false)中的=是赋值操作,不是比较。这会直接把valid设置为true,导致无论之前的校验结果如何,都会执行注册成功的代码。正确的写法是用比较运算符==,或者更简洁地直接判断布尔变量:if (valid) { // 注册成功逻辑 } else { // 密码无效逻辑 }大写字母校验可优化
原来的循环会遍历整个密码,找到第一个大写字母后就可以终止循环,没必要继续检查剩余字符,提升效率。
修复后的完整代码
#include <iostream> #include <string> #include <fstream> #include <cctype> #include <cstdlib> // 假设login()和main()函数已定义 void login(); void main(); void registration() { system("cls"); bool valid = false; const int minLength = 8; const int maxLength = 20; std::string regUsername, regPassword; std::cout << "Welcome to the registration page!\n"; std::cout << "Please enter a username: \n"; std::cin >> regUsername; std::cout << "Enter a password that is 8-20 characters long, with an uppercase and lowercase \n"; std::cin >> regPassword; // 先校验长度是否符合要求 if (regPassword.length() >= minLength && regPassword.length() <= maxLength) { // 检查是否包含大写字母 for (int k = 0; k < regPassword.length(); k++) { if (std::isupper(regPassword[k])) { valid = true; break; // 找到大写字母后直接终止循环 } } } if (valid) { std::ofstream registerUser("records.txt", std::ios::app); if (registerUser.is_open()) { // 增加文件打开判断,避免写入失败 registerUser << regUsername << " " << regPassword << std::endl; } system("cls"); int choice; std::cout << "Welcome aboard " << regUsername << ", your registration has been successful!\n"; std::cout << "Press 1 if you would like to login, and 2 if you would like to return to the main menu.\n"; std::cin >> choice; switch (choice) { case 1: login(); break; case 2: main(); break; default: std::cout << "Invalid input, returning to main menu.\n"; main(); break; } } else { std::cout << "Invalid password, please attempt to create an account again.\n"; registration(); } }
额外提几个小建议:
- 把minLength和maxLength设为
const,避免意外修改; - 增加文件打开的判断,防止文件无法打开时的错误;
- 注意
isupper需要包含<cctype>头文件,并且最好用std::isupper避免命名冲突。
内容的提问来源于stack exchange,提问作者shadowz123123
相关产品推荐
相关产品推荐

