欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > 生成密码c++

生成密码c++

2025/3/17 10:39:31 来源:https://blog.csdn.net/qq_62893047/article/details/141560336  浏览:    关键词:生成密码c++

需求

目前需要实现生成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 = "";//rootPassWordstd::string rootPassWord = generatePassword();std::cout << "Generated Password :" << rootPassWord << std::endl;//userPassWordfor (;;){std::cout << "Please cin userPassWord :";std::cin >> userPassWord;// function for judgingif (isPasswordValid(userPassWord)){// reWrite rootPassWordrootPassWord = 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 是一个小写字母,返回非零值。否则,返回零。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词