Westbrook_ @ 2025-01-05 22:12:50
#include<bits/stdc++.h>
using namespace std;
bool iszheng(string s){//一个判断字符串是否符合3个条件的代码
int diyi=0,dier=0,disan=0,now=99999,xiaoxie=0,daxie=0,shuzi=0,zifu=0,now2=1;
if(s.size()>=6&&s.size()<=12) //如果长度合适,第一个条件正确,赋值为1否则赋值0
diyi=1;
else
diyi=0;
//以上4行代码判断第一个条件符不符合,因为第一个条件很简单,所以不需要准备什么,直接判断
for(int i=0;i<s.size();i++){//遍历整个字符串,开始操作
if(s[i]=='a'||s[i]=='b'||s[i]=='c'||s[i]=='d'||s[i]=='e'||s[i]=='f'||s[i]=='g'||s[i]=='h'||s[i]=='i'||s[i]=='j'||s[i]=='k'||s[i]=='l'||s[i]=='m'||s[i]=='n'||s[i]=='o'||s[i]=='p'||s[i]=='q'||s[i]=='r'||s[i]=='s'||s[i]=='t'||s[i]=='u'||s[i]=='v'||s[i]=='w'||s[i]=='x'||s[i]=='y'||s[i]=='z'){
xiaoxie++;//如果是小写字母,那么小写字母计数器++
}
else if(s[i]=='A'||s[i]=='B'||s[i]=='C'||s[i]=='D'||s[i]=='E'||s[i]=='F'||s[i]=='G'||s[i]=='H'||s[i]=='I'||s[i]=='J'||s[i]=='K'||s[i]=='L'||s[i]=='M'||s[i]=='N'||s[i]=='O'||s[i]=='P'||s[i]=='Q'||s[i]=='R'||s[i]=='S'||s[i]=='T'||s[i]=='U'||s[i]=='V'||s[i]=='W'||s[i]=='X'||s[i]=='Y'||s[i]=='Z'){
daxie++;//如果是大写字母,那么同理++
}
else if(s[i]=='0'||s[i]=='1'||s[i]=='2'||s[i]=='3'||s[i]=='4'||s[i]=='5'||s[i]=='6'||s[i]=='7'||s[i]=='8'||s[i]=='9'){
shuzi++;//如果是个数字,那么++
}
else if(s[i]=='!'||s[i]=='@'||s[i]=='#'||s[i]=='$'){
zifu++;//如果是字符也++
}
//以上12行代码为判断第三个条件做准备
//为什么不按1,2,3条件的顺序来,是因为2和3的判断顺序结构有冲突,就先为3准备了
if(s[i]=='a'||s[i]=='b'||s[i]=='c'||s[i]=='d'||s[i]=='e'||s[i]=='f'||s[i]=='g'||s[i]=='h'||s[i]=='i'||s[i]=='j'||s[i]=='k'||s[i]=='l'||s[i]=='m'||s[i]=='n'||s[i]=='o'||s[i]=='p'||s[i]=='q'||s[i]=='r'||s[i]=='s'||s[i]=='t'||s[i]=='u'||s[i]=='v'||s[i]=='w'||s[i]=='x'||s[i]=='y'||s[i]=='z'||s[i]=='A'||s[i]=='B'||s[i]=='C'||s[i]=='D'||s[i]=='E'||s[i]=='F'||s[i]=='G'||s[i]=='H'||s[i]=='I'||s[i]=='J'||s[i]=='K'||s[i]=='L'||s[i]=='M'||s[i]=='N'||s[i]=='O'||s[i]=='P'||s[i]=='Q'||s[i]=='R'||s[i]=='S'||s[i]=='T'||s[i]=='U'||s[i]=='V'||s[i]=='W'||s[i]=='X'||s[i]=='Y'||s[i]=='Z'||s[i]=='0'||s[i]=='1'||s[i]=='2'||s[i]=='3'||s[i]=='4'||s[i]=='5'||s[i]=='6'||s[i]=='7'||s[i]=='8'||s[i]=='9'||s[i]=='!'||s[i]=='@'||s[i]=='#'||s[i]=='$'){
now=1;//如果在范围内那么now是1
}
else{
now2=0;//如果有不在范围内的,那么赋值为0。这里不写成now=0是因为怕后面有在范围内的,就又给刷新成1了,但是实际上只要是有不在范围内的他就不对。所以用了个新变量now2
}
//以上6行代码是为第二个条件的判断做准备
}
//上面这个大for循环主要是做准备。因为没办法直接判断
if(now2!=0){//如果没有不在范围内的,那么第二条件符合,赋值1否则0
dier=1;
}
else
dier=0;
//以上5行判断第二条件
if(xiaoxie+daxie+shuzi+zifu>3){//如果满足第三个条件同理,这4个变量相加>3那就说明一定符合
disan=1;
}
else
disan=0;
//以上5行判断第三个条件
if(diyi==1&&dier==1&&disan==1){//如果3个条件全部正确
return true;//这个字符串是对的
}
return false;//否则是错的
}
int main(){
string s,noww;
cin>>s;//读入整个
for(int i=0;i<s.size();i++){
while(s[i]!=','){//当不断开的时候拼接给noww
noww+=s[i];
i++;
}
if(iszheng(noww))//如果是正确的就输出
cout<<noww<<endl;
noww="";//判断完后清空
}
}
by wurang @ 2025-01-05 22:28:08
哥们这真是你手敲的吗?
普及一个概念,0~9的ASCLL码是连着的,a-z,A-Z同理
RE原因:
行末没有逗号,你的while不会停
此处给出正解:
#include<bits/stdc++.h
using namespace std;
bool check(string s)
{
bool b1 = false, b2 = false, b3= false , b4= false;
if(s.size() < 6 || s.size() > 12) return false;//长度错误
for(int i = 0; i < s.size(); i ++)
{
if(s[i] >= 'a' && s[i] <= 'z') b1 = true;//大写
else if(s[i] >= 'A' && s[i] <= 'Z') b2 = true;//小写
else if(s[i] <= '9' && s[i] >= '0') b3 = true;//数字
else if(s[i] == '!' || s[i] == '@' || s[i] == '#' || s[i] == '$') b4 = true;//特殊字符
else return false;
}
if(b1 + b2 + b3 >= 2 && b4) return true;//大小写+数字至少两种 && 有特殊字符
return false;//否则错误
}
int main()
{
string str;
cin>>str;
int n = 1 ;
string s[101];
string res;
for(int i = 0;i < str.size() ;i ++)
{
if(str[i] != ',')//找到',',分出字符串
res += str[i];
else {
s[n ++ ] = res;
res.clear();
}
}
s[n ++ ] = res;
for(int i = 1 ;i < n ;i ++)
{
//cout<<s[i]<<endl;
if(check(s[i])) cout<<s[i]<<endl;
}
if(check(s[n])) cout<<s[n];
@Westbrook_求关
by Westbrook_ @ 2025-01-05 22:40:49
@wurang 是的,谢谢已互关
by AyanamiLea @ 2025-01-05 23:28:15
@Westbrook_ 更简洁地,判断字符 ch
是否是
isupper(ch)
islower(ch)
isalpha(ch)
isalnum(ch)
要包含头文件 cctype
。
可以将大小写字母互相转化:
tolower(ch)
toupper(ch)
by Westbrook_ @ 2025-01-05 23:41:46
@AyanamiLea 已学习,感谢