【洛谷】密码合规性检查 (C)

文章介绍了如何使用C语言编程解决密码合规性检查问题,涉及子串截取、字符类型判断和输入有效性验证,包括了样例输入输出和实现的代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[GESP202306 三级] 密码合规

题源:[GESP202306 三级] 密码合规

借以此问题实践指定范围的子串截取方法。

题目描述

网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求 :。

  1. 只能由 a ∼ z \texttt a \sim \texttt z az 之间 26 26 26 个小写字母、 A ∼ Z \texttt A \sim \texttt Z AZ 之间 26 26 26 个大写字母、 0 ∼ 9 0 \sim 9 09 之间 10 10 10 个数字以及 !@#$ 四个特殊字符构成。
  2. 密码最短长度 : 6 :6 :6 个字符,密码最大长度 : 12 :12 :12 个字符。
  3. 大写字母,小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。

输入格式

输入一行不含空格的字符串。约定长度不超过 100 100 100。该字符串被英文逗号分隔为多段,作为多组被检测密码。

输出格式

输出若干行,每行输出一组合规的密码。输出顺序以输入先后为序,即先输入则先输出。

样例 #1

样例输入 #1

seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@!

样例输出 #1

seHJ12!@
sjdkffH$123

提示

【样例 1 解释】
输入被英文逗号分为了四组被检测密码:seHJ12!@sjdkffH$123sdf!@&12HDHa!123&^YUhg@!。其中 sdf!@&12HDHa! 长度超过 12 个字符,不合规;123&^YUhg@! 包含四个特殊字符之外的字符不合规。

思路

本问题分三步来解决:

  1. 以逗号分割,保证每次迭代都可提取出一个待检测密码(注意判断原字符串结束位置);
  2. 设计一个指定范围的子串分割方法,其中区间为左闭右开
  3. 按照问题要求,设计一个判断密码是否符合要求的方法。

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define OK 1
#define NO 0
typedef long long LL;

// const int INF = 2e9;
// const double pi = 3.14;

char* substr(char a[], int l, int r) {
    char *ans = (char*)malloc(sizeof(char) * 101);
    int i, j = 0;
    for (i = l; i < r; i++) {
        ans[j++] = a[i];
    }
    ans[j] = '\0';
    return ans;
}

int check(char* s, int sz) {
    if (sz < 6 || sz > 12)
        return NO;
    int i, lowcase = 0, uppercase = 0, num = 0, sp = 0;
    for (i = 0; i < sz; i++) {
        if (s[i] > 'a' && s[i] <= 'z') {
            lowcase = 1;
        } else if (s[i] >= 'A' && s[i] <= 'Z') {
            uppercase = 1;
        } else if (s[i] == '!' || s[i] == '@' 
        || s[i] == '#' || s[i] == '$') {
            sp = 1;
        } else if (s[i] >= '0' && s[i] <= '9') {
            num = 1;
        } else {
            return NO;
        }
    }
    if (lowcase + uppercase + num < 2) {
        return NO;
    }
    return OK;
}

int main() {
    char ci[101]; gets(ci);
    int len = strlen(ci);
    int i = 0, j;
    while (i < len) {
        int pre = i;
        while (i != len && ci[i] != ',') i++;
        char *t = substr(ci, pre, i);
        // printf("%d\n", i - pre);
        if (check(t, i - pre)) {
            printf("%s\n", t);
        }
        i++;
    }
    return 0;
}

小结

记录本问题的原因在于一个点 —— 实现了范围指定的子串截取方法,其中的函数 substr(char a[], int l , int r) 可作为一个C语言版本模板,在类似问题中实现并调用。








每一个不曾起舞的日子,都是对生命的辜负。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_廿_尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值