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; // 如果合法则输出	
}


posted @ 2023-10-01 00:36  iamy  阅读(1858)  评论(0)    收藏  举报