先看一下本题的题目描述:
题目描述
网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求 :。
-
只能由 a∼za∼z 之间 2626 个小写字母、A∼ZA∼Z 之间 2626 个大写字母、0∼90∼9 之间 1010 个数字以及
!@#$
四个特殊字符构成。 -
密码最短长度 :6:6 个字符,密码最大长度 :12:12 个字符。
-
大写字母,小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。
输入格式
输入一行不含空格的字符串。约定长度不超过 100100。该字符串被英文逗号分隔为多段,作为多组被检测密码。
输出格式
输出若干行,每行输出一组合规的密码。输出顺序以输入先后为序,即先输入则先输出。
输入输出样例
输入 #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@!
包含四个特殊字符之外的字符不合规。
根据题目描述,可以得出一个大致思路:定义一个字符串a,通过for循环,进行一个判断:a[i]是否为','。如果a[i]==',',直接开始计数,判断小写字母,大写字母,数字,符号等各出现了多少次。否则,直接判断输出,记得重置所有的变量。
ok啊,直接上AC代码!本题只是字符串基础,就不过多讲解了。
#include<bits/stdc++.h>
using namespace std;
int main(){
//定义变量,初始化
string a,b;
int da,xiao,shu,fu,else_;
da=xiao=shu=fu=else_=0;
cin>>a;
a+=','; //给a补充一个',',否则判断不到最后一个
for(int i=0;i<=a.size();i++){
//计数
if(a[i]!=','){
if(a[i]>='a' && a[i]<='z'){
xiao++;
}
else if(a[i]>='A' && a[i]<='Z'){
da++;
}
else if(a[i]>='0' && a[i]<='9'){
shu++;
}
else if(a[i]=='@' || a[i]=='!' || a[i]=='#' || a[i]=='$'){
fu++;
}
//不要忘记判断其他情况
else{
else_++;
}
b+=a[i];
}
else{
b+='\0'; //结尾必须为'\0'
//调试
//cout<<da<<" "<<xiao<<" "<<shu<<" "<<fu<<" "<<else_<<" "<<b<<endl;
if(fu>=1 && else_==0){ //判断
if((da>0 && shu>0) || (xiao>0 && shu>0) || (da>0 && xiao>0)){
if(b.size()>=7 && b.size()<=13){
cout<<b<<endl;
}
}
}
//重置
b="";
da=xiao=shu=fu=0;
else_=0;
//重置
}
}
return 0;
}
本题可以进行优化,欢迎大佬来点评
完结撒花🎇