U305417 GSEP 3级真题 [202306] 密码合规检测
GSEP 3级真题 [202306] 密码合规检测
题目描述
网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求:
1、只能由 a - z 之间26个小写字母、 A - Z 之间26个大写字母、 0 - 9 之间10个数字以及 ! @ # $ 四个特殊字符构成。
2、密码最短长度:6个字符,密码最大长度:12个字符。
3、大写字母、小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。
输入格式
输入一行不含空格的字符串。约定长度不超过100。该字符串被英文逗号分隔为多段,作为多组被检测密码。
输出格式
输出若干行,每行输出一组合规的密码。
输出顺序以输入先后为序,即先输入则先输出。
样例 #1
样例输入 #1
seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@!
样例输出 #1
seHJ12!@
sjdkffH$123
提示
输入被英文逗号分为了四组被检测密码:“seHJ12!@”、“sjdkfH$123”、“sdf!@&12HDHa!”、“123&YUhg@!”。其中,“sdf!@&12HDHa”长度超过12个字符,不合规;“123&YUhg@!”包含四个特殊字符之外的字符“^”,不合规。
#include <iostream>
#include <cmath>
using namespace std;
bool IsUpper(char c) { // 是否是大写
return 'A' <= c && c <= 'Z';
}
bool IsLower(char c) { // 是否是小写
return 'a' <= c && c <= 'z';
}
bool IsDigi(char c) { // 是否是数字
return '0' <= c && c <= '9';
}
bool IsSpec(char c) { // 是否是特殊字符
return '!' == c || '@' == c || '#' == c || '$' == c;
}
// 判断是否合法
bool IsLegal(string s) {
// 字符长度在6到12之间
bool r = (6 <= s.length()) && (s.length() <= 12);
if (r) {
bool digi = false; // 数字
bool upper = false; // 大写
bool lower = false; // 小写
bool spec = false; // 特殊字符
for (char c: s) {
if (IsDigi(c)) digi = true;
else if (IsUpper(c)) upper = true;
else if (IsLower(c)) lower = true;
else if (IsSpec(c)) spec = true;
else { // 如果不是其中任何一种跳出
r = false;
break;
}
}
if (r) r = ((digi + upper + lower >= 2) && spec);
}
return r;
}
int main() {
string t; getline(cin, t);
string s = "";
for(char c: t) {
if (c == ',') { // 如果接受到逗号或者回车则判断是否合法
if (IsLegal(s)) cout << s << endl; // 如果合法则输出
s = "";
} else s += c;
}
if (IsLegal(s)) cout << s << endl; // 如果合法则输出
}

浙公网安备 33010602011771号