求助:实现满足指定规则的30位C++密码生成器
C++ 密码生成器规则实现方案
直接按以下逻辑修改代码,即可满足你的密码规则要求:
- 拆分字符类别:将不同类型字符单独存储,方便精准控制各类字符的生成数量
- 优先生成最低要求字符:先确保生成1个小写、6个大写、8个数字,以及2-5个随机数量的特殊字符
- 填充剩余位数:用剩余位数从所有字符类别中随机选取补充
- 打乱密码顺序:避免密码出现固定类别顺序,保证随机性
修改后的完整代码:
#include <iostream> #include <string> #include <time.h> #include <algorithm> // 用于打乱字符顺序 using namespace std; int main() { srand(time(0)); string pass; // 拆分不同类别的字符集合 string lower = "abcdefghijklmnopqrstuvwxyz"; string upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; string digit = "0123456789"; string special = ";,:.+-*/%><=!~^&|[]{}()"; string all_chars = lower + upper + digit + special; // 生成满足最低要求的字符 // 至少1个小写字母 pass += lower[rand() % lower.size()]; // 至少6个大写字母 for (int i = 0; i < 6; ++i) { pass += upper[rand() % upper.size()]; } // 至少8个数字 for (int i = 0; i < 8; ++i) { pass += digit[rand() % digit.size()]; } // 2-5个特殊字符 int special_count = rand() % 4 + 2; // 生成2到5之间的随机数 for (int i = 0; i < special_count; ++i) { pass += special[rand() % special.size()]; } // 填充剩余字符至30位 int remaining = 30 - pass.size(); for (int i = 0; i < remaining; ++i) { pass += all_chars[rand() % all_chars.size()]; } // 打乱密码字符顺序,消除固定结构 random_shuffle(pass.begin(), pass.end()); cout << "Your password: " << pass << endl; return 0; }
关键说明
- 字符拆分:将四类字符分开后,能精准控制每类字符的生成数量,确保满足规则的最低要求
- 特殊字符数量控制:
rand()%4 +2可以生成2到5之间的随机数,刚好符合2-5个特殊字符的要求 - 打乱顺序:
random_shuffle会随机重排密码中的字符,避免先固定生成各类字符导致的结构规律问题 - 边界适配:通过
pass.size()计算剩余位数,自动适配不同的特殊字符数量,保证最终密码刚好30位
内容的提问来源于stack exchange,提问作者infoguy
相关产品推荐
相关产品推荐

