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

C++密码校验功能异常求助:短密码仍能成功注册

密码校验器的问题分析与修复

你的代码里有几个关键错误导致校验逻辑失效,下面逐一说明并给出修复方案:

错误点解析

  1. 长度校验逻辑完全错误
    你写的if (regPassword.length() >= 8 || regPassword.length() <= 20)用了逻辑或||,这意味着只要满足其中一个条件就会进入分支。但任何密码长度要么>=8要么<=20(比如2字符的密码满足<=20),所以这个条件永远为真,等于没做长度校验。正确的应该用逻辑与&&,要求长度同时在8-20之间:

    if (regPassword.length() >= minLength && regPassword.length() <= maxLength)
    
  2. 用赋值运算符代替比较运算符
    if (valid = true)和else if (valid = false)中的=是赋值操作,不是比较。这会直接把valid设置为true,导致无论之前的校验结果如何,都会执行注册成功的代码。正确的写法是用比较运算符==,或者更简洁地直接判断布尔变量:

    if (valid) {
        // 注册成功逻辑
    } else {
        // 密码无效逻辑
    }
    
  3. 大写字母校验可优化
    原来的循环会遍历整个密码,找到第一个大写字母后就可以终止循环,没必要继续检查剩余字符,提升效率。

修复后的完整代码

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:57:12