生成密码c++

需求

目前需要实现生成8位密码,密码要求至少包含一位数字,一位大写字母,一位小写字母,一位特殊字符。如果用户第一次使用还没有输入密码,密码则为系统随机生成。

用户输入密码,符合规则则将默认密码覆盖掉。

需求分析

可知我们需要两个功能,1.生成默认随机密码 ,2.判断用户输入是否符合规则。

源码

cpp 复制代码
#include <iostream>
#include <string>
#include <random>
#include <ctime>
#include <algorithm>
std::string generatePassword() {
    const char* const numbers = "0123456789";
    const char* const upperchar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    const char* const lowechar = "abcdefghijklmnopqrstuvwxyz";
    const char* const specials = "!@#$%^&*()-_=+[]{}|;:,.<>?";
    const int numChars = 8; // 密码长度

    std::string password;
    std::random_device rd;
    std::mt19937 generator(rd());
    std::uniform_int_distribution<> dis;

    // 初始化密码,确保包含至少一个数字、一个大写字母、一个小写字母和一个特殊字符
    password += numbers[dis(generator) % 10];
    password += upperchar[dis(generator) % 26];
    password += lowechar[dis(generator) % 26];
    password += specials[dis(generator) % 32];

    // 填充剩余的字符
    for (int i = 4; i < numChars; ++i) {
        std::string allChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()-_=+[]{}|;:,.<>?";
        dis = std::uniform_int_distribution<>(0, allChars.size() - 1);
        password += allChars[dis(generator)];
    }

    // 打乱密码中的字符顺序,以确保随机性
    std::shuffle(password.begin(), password.end(), generator);

    return password;
}
bool isPasswordValid(const std::string& password) {
    if (password.length() != 8) {
        return false;
    }

    bool hasDigit = false;
    bool hasUpper = false;
    bool hasLower = false;
    bool hasSpecial = false;

    const std::string specials = "!@#$%^&*()-_=+[]{}|;:,.<>?";

    for (char ch : password) {
        if (isdigit(ch)) {
            hasDigit = true;
        } else if (isupper(ch)) {
            hasUpper = true;
        } else if (islower(ch)) {
            hasLower = true;
        } else if (specials.find(ch) != std::string::npos) {
            hasSpecial = true;
        }

        if (hasDigit && hasUpper && hasLower && hasSpecial) {
            return true;
        }
    }

    return hasDigit && hasUpper && hasLower && hasSpecial;
}

int main() {
    std::string userPassWord = "";
    //rootPassWord
    std::string rootPassWord = generatePassword();
    std::cout << "Generated Password :" << rootPassWord << std::endl;
    //userPassWord
    for (;;)
    {
        std::cout << "Please cin userPassWord :";
        std::cin >> userPassWord;
        // function for judging
        if (isPasswordValid(userPassWord))
        {
            // reWrite rootPassWord
            rootPassWord = userPassWord;
            std::cout << "right passWord!!!" << std::endl;
            std::cout << "rootPassWord :" << rootPassWord << std::endl;
            break;
        }else{
            std::cout << "out of valid!!!" <<  std::endl;
        }
    }

    return 0;
}

运行结果

生成默认随机密码

随机数生成

std::random_device rd:用于获取随机数种子。

std::mt19937 generator(rd()):以 rd 作为种子,初始化 Mersenne Twister 伪随机数生成器。

std::uniform_int_distribution<> dis:用于生成特定范围内的均匀分布的随机整数。

打乱字符串

cpp 复制代码
std::shuffle(password.begin(), password.end(), generator);

函数原型

cpp 复制代码
template <class RandomIt>
void shuffle ( RandomIt first, RandomIt last, URNG&& g);
c 复制代码
std::shuffle(password.begin(), password.end(), generator);

RandomIt: 表示一个随机访问迭代器,指向要打乱的序列的开始位置。

URNG: 表示一个均匀随机数生成器,它是一个被移动的参数,通常是一个伪随机数生成器,如 std::mt19937。

函数参数

first, last: 这两个参数定义了要被打乱的序列的范围。first 是序列的开始迭代器,而 last 是序列的结束迭代器(不包括)。

g: 这是一个均匀随机数生成器,用于生成随机数来决定元素的新位置。

使用示例

判断用户输入是否符合规则。

剪枝

要求密码必须为八位,非八位密码就不需要继续验证了。

cpp 复制代码
if (password.length() != 8) {
        return false;
    }

isdigit()

函数原型

cpp 复制代码
int isdigit(int ch);

函数参数

参数:ch 是要检查的字符,它应该是一个 unsigned char 值,或者可以表示为 unsigned char 的值(例如,通过强制转换)。

返回值:如果 ch 是一个数字字符('0' 到 '9'),返回非零值。否则,返回零。

isupper()

函数原型

cpp 复制代码
int isupper(int ch);

函数参数

参数:ch 是要检查的字符,它应该是一个 unsigned char 值,或者可以表示为 unsigned char 的值(例如,通过强制转换)。

返回值:如果 ch 是一个大写字母,返回非零值。否则,返回零。

islower()

函数原型

cpp 复制代码
int islower(int ch);

函数参数

参数:ch 是要检查的字符,它应该是一个 unsigned char 值,或者可以表示为 unsigned char 的值(例如,通过强制转换)。

返回值:如果 ch 是一个小写字母,返回非零值。否则,返回零。

相关推荐
Pniubi2 分钟前
HashMap的扩容和树化边界
java·开发语言
gCode Teacher 格码致知2 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
发量惊人的中年网工2 小时前
分公司访问总部ERP慢怎么办?SD-WAN组网的排查与验收要点
服务器·开发语言·php
下页、再停留2 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#
ShineWinsu2 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
罗西的思考3 小时前
【Agentic RL】Dressage Staleness 控制深度分析
人工智能·算法·机器学习
quaer3 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
益莱储中国4 小时前
深度解析:RF 实验室从 5G迈向 6G 的过程中保持技术领先与设备升级的路径
开发语言·php
丰色木夕5 小时前
Ubuntu22.04下源码编译安装USD-Brep
c++·ubuntu·nvidia·usd-brep
benchmark_cc5 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash