生成密码c++

news2024/12/23 0:31:10

需求

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

需求分析

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

源码

#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:用于生成特定范围内的均匀分布的随机整数。

打乱字符串

std::shuffle(password.begin(), password.end(), generator);

函数原型

template <class RandomIt>
void shuffle ( RandomIt first, RandomIt last, URNG&& g);
std::shuffle(password.begin(), password.end(), generator);

RandomIt: 表示一个随机访问迭代器,指向要打乱的序列的开始位置。
URNG: 表示一个均匀随机数生成器,它是一个被移动的参数,通常是一个伪随机数生成器,如 std::mt19937。

函数参数

first, last: 这两个参数定义了要被打乱的序列的范围。first 是序列的开始迭代器,而 last 是序列的结束迭代器(不包括)。
g: 这是一个均匀随机数生成器,用于生成随机数来决定元素的新位置。
使用示例

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

剪枝

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

if (password.length() != 8) {
        return false;
    }

isdigit()

函数原型

int isdigit(int ch);

函数参数

参数:ch 是要检查的字符,它应该是一个 unsigned char 值,或者可以表示为 unsigned char 的值(例如,通过强制转换)。
返回值:如果 ch 是一个数字字符(‘0’ 到 ‘9’),返回非零值。否则,返回零。

isupper()

函数原型

int isupper(int ch);

函数参数

参数:ch 是要检查的字符,它应该是一个 unsigned char 值,或者可以表示为 unsigned char 的值(例如,通过强制转换)。
返回值:如果 ch 是一个大写字母,返回非零值。否则,返回零。

islower()

函数原型

int islower(int ch);

函数参数

参数:ch 是要检查的字符,它应该是一个 unsigned char 值,或者可以表示为 unsigned char 的值(例如,通过强制转换)。
返回值:如果 ch 是一个小写字母,返回非零值。否则,返回零。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2091793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重生之我们在ES顶端相遇第10 章- 分分分词器的基本使用

文章目录 思维导图0. 前言1. 光速上手1.1 指定分词器1.2 测试分词器 2. 分词流程(重要)2.1 基本介绍2.2 深入如何测试分词器 3. 自定义一个简单的分词器 思维导图 0. 前言 分词器在 ES 搜索使用中非常关键&#xff0c;一个好的分词器能够提高搜索的质量&#xff0c;让用户搜索…

进程间的通信(无名管道)

进程间通信 IPC InterProcess Communication 1.进程间通信方式 1.早期的进程间通信&#xff1a; 无名管道(pipe)、有名管道(fifo)、信号(signal) 2.system V PIC&#xff1a; 共享内存(share memory)、信号灯集(semaphore)、消息队列(message queue) 3.BSD: 套接字(socket) 2.无…

AI壁纸套装,单月变现7000+,手把手教你,别说你还不会

介绍 这种类型的手机壁纸&#xff0c;平板壁纸&#xff0c;电脑壁纸&#xff0c;甚至是手表壁纸&#xff0c;流量都很不错&#xff0c;尤其是深受一些女性的喜欢。 变现能力也不错&#xff0c;而且变现方式也多种多样。 今天就一步一步的教大家如何制作这种壁纸&#xff0c;怕…

本地部署 Flux.1 最强文生图大模型!Comfyui 一键安装

前言 最近&#xff0c;由前 Stability AI员工创立的黑森林实验室推出了开源文生图大模型–FLUX.1横空出世。 FLUX.1在文字生成、复杂指令遵循和人手生成上具备优势。以下是其生成图像示例&#xff0c;可以看到即使是生成大段的文字、多个人物&#xff0c;也没有出现字符、人手…

涉案财物管理系统|涉案财物全流程监测

涉案财物管理系统DW-S405系统基于物联网技术规范涉案财物管理流程&#xff0c;确保涉案财物的安全性、完整性和合法性&#xff1b;可以提高办案效率&#xff0c;减少办案成本&#xff0c;实现资源共享。 DW-S405可以深度整合大平台和物理存储区的整体一致性&#xff0c;实现对…

通信算法之229: 通信系统中的Eb/N0与SNR

通信系统中接收灵敏度是衡量系统可接收的最小信号电平。各个文章书籍中都给了接收灵敏度与SNR的关系。 但是做解调算法的工程师却在乎的是Eb/No&#xff0c;那么两者的关系什么&#xff1f;是不是都可以代表接收性能的好坏&#xff1f; Eb/No 在通信系统中&#xff0c;Eb/No 是…

带娃赚钱两不误,用AI做故事绘本,零成本轻松变现

01 利用Chatgpt生成故事脚本内容 AI Breakthroug 这一步我们可以将收集的爆款故事文案给到GPT进行改写&#xff0c;这里我重点展示如何通过提示词让GPT帮我们生成原创的故事脚本。 *▍**让GPT生成原创故事标题* 一开始不知道写什么主题故事的时候&#xff0c;这里我们可以…

报错:java: 不再支持源选项 5。请使用 8 或更高版本

Date: 2024.08.30 13:52:20 author: lijianzhan 电脑环境&#xff1a;Windows10 开发环境&#xff1a;JDK21 代码工具&#xff1a;IntelliJ IDEA 2024 一、问题 运行脚本控制台报错&#xff1a;java: 不再支持源选项 5。请使用 8 或更高版本。 二、原因 当前JDK版本比较高&…

【MySQL索引】4索引优化

索引优化 1 关联查询优化 左连接LEFT JOIN LEFT JOIN 右边是我们的关键点,一定需要建立索引 .这里是book的card 字段&#xff0c;type建不建索引无所谓。 ALTER TABLE book ADD INDEX Y ( card); #【被驱动表】&#xff0c;可以避免全表扫描 EXPLAIN SELECT SQL_NO_CACHE *…

2.5G网络(通常指2.5G以太网,即2500BASE-X)的网络变压器在设计和应用上有几个关键方面

信号传输和接收&#xff1a; 2.5G网络变压器主要用于以太网设备中&#xff0c;用于将信号从平衡转换为非平衡&#xff0c;或者进行阻抗匹配&#xff0c;确保信号能够在传输线和接收器之间有效地传输和接收。 频率范围&#xff1a; 这些变压器需要支持2.5G以太网的频率范围&…

Java 入门指南:Java 并发编程 —— 两万字详解 进程(Process)与线程(Thread)

线程和进程是操作系统中两个重要的概念&#xff0c;用于实现并发执行和多任务处理。 基础概念 进程 进程&#xff08;Process&#xff09;&#xff1a;进程是计算机中正在运行的程序的实例。它是操作系统分配系统资源的基本单位&#xff0c;包括程序代码、数据、打开的文件、…

Global Illumination_LPV Deep Optimizations

接上回&#xff0c;RSM优化技术介绍后&#xff0c;我们本部分主要看一下&#xff0c;光栅GI三部曲中的LPV&#xff0c;这个算法算是很巧妙了&#xff0c;算法思路基于RSM上拓展到世界空间&#xff0c;可以说很具学习和思考价值&#xff0c;之前也简单实现过Global Illumination…

【 html+css 绚丽Loading 】000028 九宫幻明轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

AI智能导诊小程序源码,在智能导诊系统中,自然语言处理技术的运用

概述 智能导诊基于医疗 AI 、自然语言处理技术&#xff0c;推出的在线导医分诊智能工具&#xff0c;覆盖导诊、智能问答、科普宣教等就医服务&#xff1b;智能导诊通过人体图、症状列表等形式进行疾病自测&#xff0c;快速推荐就诊科室、医生推荐。产品可应用于微信线上挂号、…

SQLi-LABS通关攻略【51-55关】

SQLi-LABS 51关 51关和50关一样&#xff0c;只是改为了单引号闭合 依旧有报错信息&#xff0c;可以使用报错注入 构造payload,得到数据库名 ?sort1 and updatexml(1,concat(1,database()),1)-- SQLi-LABS 52关 52关和50关一样&#xff0c;但是没有报错信息&#xff0c;所以报…

智慧监管:地理信息与遥感技术驱动下的社会治理新纪元

在信息化浪潮席卷全球的今天&#xff0c;智慧监管已成为推动社会治理现代化的关键力量。本文将深入剖析智慧监管的概念、技术基础、应用场景及其对社会发展的深远影响&#xff0c;探讨如何在新时代背景下&#xff0c;利用地理信息与遥感技术构建更加智慧、高效的监管体系。 智…

仿华为车机UI--图标从Workspace拖动到Hotseat同时保留图标在原来位置

基于Android13 Launcher3,原生系统如果把图标从Workspace拖动到Hotseat里则Workspace就没有了&#xff0c;需求是执行拖拽动作后&#xff0c;图标同时保留在原位置。 实现效果如下&#xff1a; 实现思路&#xff1a; 1.如果在workspace中拖动&#xff0c;则保留原来“改变图标…

【u盘还原教程】如何把启动u盘恢复回普通U盘

之前制作ubuntu启动盘装双系统 1、插入U盘&#xff0c;右键点击“此电脑”&#xff0c;选择“管理”&#xff0c;在“计算机管理”的面板中点击打开“磁盘管理”&#xff0c;会看到目前电脑上的所有磁盘&#xff0c;找到U盘的索引名&#xff08;如图标识&#xff0c;这里是“…

2024最新VMware17安装Windows10详细记录

本次将带来虚拟机VMware Workstation 17 pro安装Win10的教学&#xff0c;可用于各种软件测试&#xff0c;这里虽然只是示范了win10安装教学&#xff0c;实际上可以安装很多系统&#xff0c;步骤都差不多&#xff1b; 下载 一、下载虚拟机软件 下载方式一&#xff1a;官网下载…

虚拟机安装docker时yum错误及及解决方案

** Could not resolve host: mirrorlist.centos.org; 未知的错误 ** 出现这种错误&#xff0c;先尝试 ping www.baidu.com&#xff0c;然后再尝试 ping mirrorlist.centos.org 如果&#xff0c;baidu.com可以ping通&#xff0c;mirrorlist.centos.org 不能ping通&#xff0…