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

六、🏆 知识点总结:

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

✨ 字符分类判断

✨ 多条件验证

✨ 函数封装

✨ 模拟真实系统


相关推荐
钰珠AIOT2 小时前
什么是句柄,有什么用?适用于什么场景?
c语言·c++
众少成多积小致巨2 小时前
Android 初始化语言入门
android·linux·c++
yangtuoni2 小时前
vscode调试C++ python相关配置
c++·vscode·python
wuyoula2 小时前
尹之盾企业版网络验证
服务器·开发语言·javascript·c++·人工智能·ui·c#
hi_ro_a3 小时前
C++ 手撕 STL 底层:红黑树封装 mymap/myset
数据结构·c++·算法
小卓(friendhan2005)3 小时前
基于Qt的音乐播放器项目
数据库·c++·qt
tankeven3 小时前
贪心算法(Greedy Algorithm)详解:从理论到C++实践
c++·算法
Hesionberger3 小时前
LeetCode72.编辑距离(多维动态规划)
java·开发语言·c++·python·算法
郝学胜-神的一滴3 小时前
从底层看透Linux高性能服务器:epoll自定义封装与超时清理实战
linux·服务器·c++·网络协议·tcp/ip·unix