RE求调(有注释)(在线等)

B3843 [GESP202306 三级] 密码合规

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不会停

此处给出正解:

{ACcode}
#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 是否是

要包含头文件 cctype

可以将大小写字母互相转化:


by Westbrook_ @ 2025-01-05 23:41:46

@AyanamiLea 已学习,感谢


|