2. 密码合规检测
【问题描述】
网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求:1、只能由 a-z 之间 26 个小写字母、A-Z 之间 26 个大写字母、0-9 之间 10个数字以!@#$四个特殊字符构成。
2、密码最短长度:6 个字符,密码最大长度:12 个字符。
3、大写字母、小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。
【输入描述】
输入一行不含空格的字符串。约定长度不超过 100。该字符串被英文逗号分隔为多段,作为多组被检测密码。
【输出描述】
输出若干行,每行输出一组合规的密码。
输出顺序以输入先后为序,即先输入则先输出。
【样例输入 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@!”包含四个特殊字符之外的字符“^”,不合规。
解析:字符串处理问题,详见代码:
#include <iostream>
using namespace std;
string s;
bool check(string x){
int a=0,A=0,d=0,f=0;//小写字母,大写字母,数字,符号
if (x.size()>12||x.size()<6) return false;//长度不合法
for(int i=0;i<x.length();i++){
if(x[i]>='a'&&x[i]<='z'){
a=1;
}else if(x[i]>='A'&&x[i]<='Z'){
A=1;
}else if(x[i]>='0'&&x[i]<='9'){
d=1;
}else if (x[i]=='!'||x[i]=='@'||x[i]=='#'||x[i]=='$'){
f=1;
}else{//其他字符,不合规
return false;
}
}
if (f==0) return false;//没有符号,不合规
if (a+A+d<2) return false;//大小写和数字少于两种,不合规
return true;//其他情况合规,返回true
}
int main() {
cin>>s;
string t="";
for(int i=0;i<s.length();i++){
if (s[i]!=','){//非逗号,加到字符串末尾
t+=s[i];
}else{//遇到逗号
if (check(t)==1){//判断字符串是否合规
cout<<t<<endl;
}
t="";//清空,开始下一个字符串
}
}
return 0;
}
不用函数的版本:
#include <iostream>
using namespace std;
string s;
int main() {
cin >> s;
s += ',';
string t = "";
for(int i = 0; i < s.length(); i++) {
if (s[i] != ',') { //非逗号,加到字符串末尾
t += s[i];
} else { //遇到逗号
bool flag = 1; //假定没有其他字符
if (t.size() > 12 || t.size() < 6) flag = 0;//长度不合法
int a = 0, A = 0, d = 0, f = 0; //小写字母,大写字母,数字,符号
for(int j = 0; j < t.length(); j++) {
if(t[j] >= 'a' && t[j] <= 'z') {
a = 1;
} else if(t[j] >= 'A' && t[j] <= 'Z') {
A = 1;
} else if(t[j] >= '0' && t[j] <= '9') {
d = 1;
} else if (t[j] == '!' || t[j] == '@' || t[j] == '#' || t[j] == '$') {
f = 1;
} else { //其他字符,不合规
flag = 0;
break;
}
}
//没有其他字符,大小写字母和数字至少两种,有四种符号之一,合规
if(flag == 1 && a + A + d >= 2 && f == 1) {
cout << t << endl;
}
t = ""; //清空,开始下一个字符串
}
}
return 0;
}