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

六、🏆 知识点总结:

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

✨ 字符分类判断

✨ 多条件验证

✨ 函数封装

✨ 模拟真实系统


相关推荐
郝学胜_神的一滴19 小时前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境3 天前
C++ 的Eigen 库全解析
c++
卷无止境3 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴3 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
博客18005 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴5 天前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake
众少成多积小致巨6 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
clint45610 天前
C++进阶(1)——前景提要
c++
夜悊10 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴10 天前
CMake 021: IF 条件判据详诠
c++·cmake