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

六、🏆 知识点总结:

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

✨ 字符分类判断

✨ 多条件验证

✨ 函数封装

✨ 模拟真实系统


相关推荐
钓鱼的肝3 小时前
梳理(1-5)
c++·经验分享·笔记·算法·青少年编程
jimy14 小时前
readelf 查看“派生类”的vtable符号
开发语言·c++
蒸蒸yyyyzwd4 小时前
cpp 选手秋招学习笔记 day37 面经学习
c++·八股
YYYing.4 小时前
【C++进阶系列 (七)】C++ RTTI 深度剖析:从 typeid 到 dynamic_cast 的底层之旅
开发语言·c++·c/c++·rtti
钓鱼的肝6 小时前
csp-j-s总结(2)
c++·经验分享·笔记·算法·青少年编程
重生的黑客6 小时前
Qt 常用控件精讲(1):QWidget 核心属性全解 —— 从 geometry 到 qrc 与 QSS
c++·qt·qwidget·qss·常用控件
Hespethorn6 小时前
取 `X-Forwarded-For` 首段做频控 key,等于把限流开关交给了调用方
c++
米糕闯编程6 小时前
鱼香ros2(七)功能包组织C++节点
c++·ros2·cmakelists
汉克老师7 小时前
GESP2026年9月认证C++四级( 第三部分编程题(1、新汉诺塔))精讲
c++·gesp·小学生·学c++编程
唠玖馆8 小时前
智能指针详解
c++