CCF-GESP计算机学会等级考试2023年6月三级C++T2密码合规检测

文章描述了一个编程问题,需要编写程序检查用户输入的密码是否符合特定规则,包括字符类型、长度限制及组合要求。给出了C++代码示例来验证密码合规性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长春高老师信奥工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值