- C++
B3843 [GESP202306 三级] 密码合规
- 2025-8-26 11:58:25 @
B3843 [GESP202306 三级] 密码合规
题目描述
网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求 :。
-
只能由 之间 个小写字母、 之间 个大写字母、 之间 个数字以及
!@#$
四个特殊字符构成。 -
密码最短长度 个字符,密码最大长度 个字符。
-
大写字母,小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。
输入格式
输入一行不含空格的字符串。约定长度不超过 。该字符串被英文逗号分隔为多段,作为多组被检测密码。
输出格式
输出若干行,每行输出一组合规的密码。输出顺序以输入先后为序,即先输入则先输出。
输入输出样例 #1
输入 #1
seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@!
输出 #1
seHJ12!@
sjdkffH$123
说明/提示
【样例 1 解释】
输入被英文逗号分为了四组被检测密码:seHJ12!@
、sjdkffH$123
、sdf!@&12HDHa!
、123&^YUhg@!
。其中 sdf!@&12HDHa!
长度超过 12 个字符,不合规;123&^YUhg@!
包含四个特殊字符之外的字符不合规。
4 条评论
-
admin SU @ 2025-8-26 12:02:19已修改
#include <iostream> #include <string> using namespace std; // 检查字符是否为合法字符 bool isLegalChar(char c) { // 检查是否为小写字母 if (c >= 'a' && c <= 'z') return true; // 检查是否为大写字母 if (c >= 'A' && c <= 'Z') return true; // 检查是否为数字 if (c >= '0' && c <= '9') return true; // 检查是否为允许的特殊字符 if (c == '!' || c == '@' || c == '#' || c == '$') return true; // 其他字符均为非法 return false; } // 检查密码是否符合所有要求 bool is_valid(const string& pwd) { // 检查长度是否在6-12之间 if (pwd.length() < 6 || pwd.length() > 12) { return false; } // 检查所有字符是否合法 for (char c : pwd) { if (!isLegalChar(c)) { return false; } } // 统计各类字符的出现情况 bool hasLower = false, hasUpper = false, hasDigit = false, hasSpecial = false; for (char c : pwd) { if (c >= 'a' && c <= 'z') { hasLower = true; } else if (c >= 'A' && c <= 'Z') { hasUpper = true; } else if (c >= '0' && c <= '9') { hasDigit = true; } else { hasSpecial = true; } } // 检查是否至少有一个特殊字符 if (!hasSpecial) { return false; } // 检查是否至少有两种:大写字母、小写字母和数字 int count = 0; if (hasLower) count++; if (hasUpper) count++; if (hasDigit) count++; return count >= 2; } int main() { string input; // 读取整行输入 getline(cin, input); // 按逗号分割输入为多个密码 size_t pos = 0; while (pos < input.length()) { size_t next = input.find(',', pos); string pwd; // 如果找到逗号,提取两个逗号之间的子串 if (next != string::npos) { pwd = input.substr(pos, next - pos); pos = next + 1; } else { // 如果没找到逗号,提取剩余部分 pwd = input.substr(pos); pos = input.length(); } // 检查密码是否有效,如果有效则输出 if (is_valid(pwd)) { cout << pwd << endl; } } return 0; }
-
2025-8-26 12:02:08@
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; // 分割字符串为子串,以逗号为分隔符 vector<string> split(const string &s) { vector<string> res; string temp; for (char c : s) { if (c == ',') { res.push_back(temp); temp.clear(); } else { temp += c; } } res.push_back(temp); // 添加最后一个子串 return res; } // 检查字符是否为允许的特殊字符 bool isSpecialChar(char c) { return c == '!' || c == '@' || c == '#' || c == '$'; } // 检查密码是否合规 bool isValidPassword(const string &password) { // 检查长度是否在6-12之间 if (password.length() < 6 || password.length() > 12) { return false; } bool hasLower = false, hasUpper = false, hasDigit = false, hasSpecial = false; for (char c : password) { // 检查字符是否合法 if (islower(c)) { hasLower = true; } else if (isupper(c)) { hasUpper = true; } else if (isdigit(c)) { hasDigit = true; } else if (isSpecialChar(c)) { hasSpecial = true; } else { // 包含不允许的字符 return false; } } // 检查是否至少有一个特殊字符 if (!hasSpecial) { return false; } // 检查是否至少有大写、小写和数字中的两种 int count = 0; if (hasLower) count++; if (hasUpper) count++; if (hasDigit) count++; return count >= 2; } int main() { string input; getline(cin, input); vector<string> passwords = split(input); for (const string &pwd : passwords) { if (isValidPassword(pwd)) { cout << pwd << endl; } } return 0; }
-
2025-8-26 11:59:22@
#include<iostream> #include<vector> #include<string> using namespace std; // 检查密码是否只包含允许的字符 // 允许的字符包括:大小写字母、数字以及!@#$四个特殊字符 bool ok1(string str) { // 遍历密码中的每个字符 for (char it : str) { // 基于范围的for循环,逐个访问字符串中的字符 // 检查是否为小写字母 if ('a' <= it && it <= 'z') { continue; // 符合要求,继续检查下一个字符 } // 检查是否为大写字母 else if ('A' <= it && it <= 'Z') { continue; // 符合要求,继续检查下一个字符 } // 检查是否为数字 else if ('0' <= it && it <= '9') { continue; // 符合要求,继续检查下一个字符 } // 检查是否为允许的特殊字符 else if (it == '!' || it == '@' || it == '#' || it == '$') { continue; // 符合要求,继续检查下一个字符 } // 如果以上条件都不满足,说明包含非法字符 else { return false; } } // 所有字符都检查通过 return true; } // 检查密码长度是否在6-12个字符之间 bool ok2(string str) { int len = str.size(); // 获取密码长度 // 验证长度是否在合法范围内 if (len >= 6 && len <= 12) { return true; } else { return false; } } // 检查密码是否满足字符类型要求: // 1. 大写字母、小写字母和数字中至少包含两种 // 2. 至少包含一个特殊字符(!@#$) bool ok3(string str) { // 初始化标记变量,0表示不存在,1表示存在 int da = 0, // 大写字母标记 xiao = 0, // 小写字母标记 shuzi = 0, // 数字标记 teshu = 0; // 特殊字符标记 // 遍历密码中的每个字符,检查字符类型 for (char it : str) { if ('A' <= it && it <= 'Z') { da = 1; // 标记存在大写字母 } if ('a' <= it && it <= 'z') { xiao = 1; // 标记存在小写字母 } if ('0' <= it && it <= '9') { shuzi = 1; // 标记存在数字 } if (it == '!' || it == '@' || it == '#' || it == '$') { teshu = 1; // 标记存在特殊字符 } } // 检查是否满足条件:字母数字至少两种,且有特殊字符 if (da + xiao + shuzi >= 2 && teshu == 1) { return true; } else { return false; } } int main() { string str; // 读取一行输入,包含多个用逗号分隔的密码 getline(cin, str); // 在输入字符串末尾添加一个逗号,方便后续分割处理 str += ','; // 用于存储分割后的各个密码 vector<string> word; int left = 0; // 记录当前密码的起始位置 int douHao; // 记录逗号的位置 // 分割字符串,提取各个密码 while (true) { // 从left位置开始查找下一个逗号 douHao = str.find(',', left); // 如果找不到逗号,说明所有密码都已提取完毕 if (douHao == -1) { break; } // 提取从left到逗号位置的子串,作为一个密码 word.push_back(str.substr(left, douHao - left)); // 更新下一个密码的起始位置 left = douHao + 1; } // 检查每个密码是否合规,并输出合规的密码 for (string it : word) { // 只有当三个条件都满足时,才是合规密码 if (ok1(it) && ok2(it) && ok3(it)) { cout << it << endl; } } return 0; }
-
2025-8-26 11:58:35@
#include<iostream> #include<vector> #include<string> using namespace std; bool ok1(string str) { //1、只能由 a∼z 之间 26 个小写字母、A∼Z 之间 26 个大写字母、0∼9 之间 10 个数字以及 !@#$ 四个特殊字符构成。 int cnt = 0; int len = str.size(); for (char it : str) { //基于范围的for循环 if ('a' <= it && it <= 'z') { cnt += 1; } else if ('A' <= it && it <= 'Z') { cnt += 1; } else if ('0' <= it && it <= '9') { cnt += 1; } else if (it == '!' || it == '@' || it == '#' || it == '$') { cnt += 1; } } if (cnt == len) { return true; } else { return false; } } bool ok2(string str) { //2、密码最短长度 :6 个字符,密码最大长度 :12 个字符。 int len = str.size(); if (len >= 6 && len <= 12) { return true; } else { return false; } } bool ok3(string str) { //3、大写字母,小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。 int da = 0, xiao = 0, shuzi = 0, teshu = 0; for (char it : str) { //基于范围的for循环 if ('A' <= it && it <= 'Z') { da = 1; } if ('a' <= it && it <= 'z') { xiao = 1; } if ('0' <= it && it <= '9') { shuzi = 1; } if (it == '!' || it == '@' || it == '#' || it == '$') { teshu = 1; } } if (da + xiao + shuzi >= 2 && teshu == 1) { return true; } else { return false; } } int main() { string str; getline(cin, str); str += ','; //string word[200]; vector<string> word; //find查找子串函数 //substr提取子串 int left = 0;//子串的起始下标 int douHao = -1; while (1) { douHao = str.find(',', left); if (douHao == -1) { break; } //find("子串",开始查找到起始下标) word.push_back(str.substr(left, douHao - left)); left = douHao + 1; } for (string it : word) { //基于范围的for循环 //cout<<it<<" "<<it.size()<<endl; if (ok1(it) && ok2(it) && ok3(it)) { cout << it << endl; } } return 0; }
- 1