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

六、🏆 知识点总结:

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

✨ 字符分类判断

✨ 多条件验证

✨ 函数封装

✨ 模拟真实系统


相关推荐
潼心1412o5 小时前
C++初阶(长期更新)第5讲:类和对象(中)
开发语言·c++
weixin_307779135 小时前
C++代码实现MATLAB中的normalize函数功能
开发语言·c++·算法·matlab
(Charon)6 小时前
【C++面试】手写String类:同时实现拷贝构造与移动构造
c++·算法
程序员老陆6 小时前
通过std::unique_ptr初始化std::shared_ptr
开发语言·c++
Logic1017 小时前
C语言/数据结构字符串题解:最短循环节——找出能重复构成原串的最短基础子串
c语言·数据结构·字符串·枚举·时间复杂度·算法题·kmp优化
西西弗Sisyphus8 小时前
Qt6 实现 会动的界面像物理世界一样
c++·qt
UIU1148 小时前
头文件可以防什么错?运用头文件做声明
c++·学习·c#
by209998 小时前
list:迭代器与资源管理实现的综合叙述(下)
数据结构·c++·笔记·list
MayZork9 小时前
Qt 开发集成CMake + vcpkg
开发语言·c++·qt
书生执笔画浮沉9 小时前
Linux桌面端应用向鸿蒙PC迁移适配纪实
c++·qt·c·信创·海思·libc·ohos