GESP2023年6月认证C++三级( 第三部分编程题(2、密码合规检测))


一、🔐 故事背景:守护密码之门!

在魔法学院门口,有一扇超级智能大门🚪。

它会检查每个进入的人的密码:

👮‍♂️"只有符合规则的密码,才能进去!"

否则:

❌ "不合格,禁止进入!"


二、🎯 密码规则(大门的要求)

每个密码必须满足:


🧩 规则1:字符合法

只能包含:

✔ 小写字母 a~z

✔ 大写字母 A~Z

✔ 数字 0~9

✔ 特殊字符:! @ # $

❌ 其他字符(比如 ^、&)直接淘汰!


📏 规则2:长度限制

复制代码
6 ≤ 长度 ≤ 12

太短 ❌

太长 ❌


🎨 规则3:种类要求

必须满足:

👉 至少有 两种类型

  • 大写字母

  • 小写字母

  • 数字

👉 并且必须有:

至少 一个特殊字符(!@#$)


🧠 输入长什么样?

输入是一整行:

复制代码
abc123!,HELLO12$,bad^pwd,Ok1!

👉 用逗号分隔多个密码!

我们要一个一个检查!


三、🏗️ 解题思路


🌟 第一步:把字符串"切开"

像切香肠一样🍖:

复制代码
遇到 , 就分成一个密码

🌟 第二步:检查每个密码

我们写一个"守卫函数":

复制代码
bool check(char *str, int len)

🌟 第三步:逐个字符分析

就像安检一样🛂:

复制代码
if ('A' <= c <= 'Z') → 大写
if ('a' <= c <= 'z') → 小写
if ('0' <= c <= '9') → 数字
if c 是 !@#$ → 特殊字符
否则 ❌ 不合法

🌟 第四步:记录"身份"

我们用4个开关:

复制代码
hasC  // 大写
hasL  // 小写
hasD  // 数字
hasS  // 特殊字符

🌟 第五步:最终判断

复制代码
必须:
✔ 有特殊字符
✔ 至少两种(大写/小写/数字)
✔ 长度合法
✔ 没有非法字符

四、💻 参考代码

复制代码
#include <iostream>
using namespace std;

char line[101];
char pwd[101];

// 检查密码是否合法
bool check(char *str, int l) {
    if (l < 6 || l > 12)
        return false;

    bool hasC = false, hasL = false, hasD = false, hasS = false;

    for (int i = 0; str[i] != '\0'; i++) {
        if ('A' <= str[i] && str[i] <= 'Z') {
            hasC = true;
        } else if ('a' <= str[i] && str[i] <= 'z') {
            hasL = true;
        } else if ('0' <= str[i] && str[i] <= '9') {
            hasD = true;
        } else if (str[i] == '!' || str[i] == '@' ||
                   str[i] == '#' || str[i] == '$') {
            hasS = true;
        } else {
            return false; // 出现非法字符
        }
    }

    if (!hasS) return false;
    if (hasC + hasL + hasD < 2) return false;

    return true;
}

int main() {
    cin >> line;

    int len = 0;

    for (int i = 0; line[i] != '\0'; i++) {
        if (line[i] != ',') {
            pwd[len++] = line[i];
        } else {
            pwd[len] = '\0';
            if (check(pwd, len))
                cout << pwd << endl;
            len = 0;
        }
    }

    // 最后一个密码
    if (len > 0) {
        pwd[len] = '\0';
        if (check(pwd, len))
            cout << pwd << endl;
    }

    return 0;
}

五、🎯 举例加深理解

1、🌟输入:

复制代码
seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@!

2、🧠分析:

密码 结果
seHJ12!@ ✔ 合法
sjdkffH$123 ✔ 合法
sdf!@&12HDHa! ❌ 太长
123&^YUhg@! ❌ 有非法字符 ^

3、🎉输出:

复制代码
seHJ12!@
sjdkffH$123

六、🏆 知识点总结:

✨ 字符串拆分(逗号分割)

✨ 字符分类判断

✨ 多条件验证

✨ 函数封装

✨ 模拟真实系统


相关推荐
2401_868534785 小时前
RTOS之RT-Thread & Linux:线程/进程管理与调度核心差异分析
c++·python
郝学胜-神的一滴7 小时前
Qt 高级编程 040:按钮悬浮弹出滑块弹窗的完整攻略
开发语言·c++·qt·软件工程·用户界面
程序喵大人11 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法
ZhangShao060711 小时前
题解:CF2249B
c++·算法
吹什么轩13 小时前
c++复习:map和set的使用
开发语言·c++
fpcc13 小时前
跟我学C++中级篇—内存流
开发语言·c++
吹什么轩15 小时前
c++复习:模拟实现list来更好的理解和应用list
开发语言·c++
AmyLin_200115 小时前
PDF 色彩保真工程实践【5】核心实现(下):拼装 Image XObject、页面资源与内容流
c++·pdf·sdk·颜色空间·印刷·icc·cmyk
tianyu23416 小时前
MySQL字符串处理函数完全指南:从入门到实战
mysql·字符串·函数·截取
乱七八糟的屋子16 小时前
MTL4 (Matrix Template Library) 超详细实战教程|C++高性能稠密/稀疏矩阵计算
c++·矩阵·稀疏矩阵·mtl4·matrixtemplate·c++线性代数·高性能数值计算