C练题笔记之:牛客-HJ020.密码验证合格程序

题目:

描述

密码要求:

1.长度超过8位

2.包括大小写字母.数字.其它符号,以上四种至少三种

3.不能有相同长度大于2的子串重复

输入描述:

一组或多组长度超过2的字符串。每组占一行

输出描述:

如果符合要求输出:OK,否则输出NG

示例1

输入:

021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000

复制输出:

OK
NG
NG
OK

结果:

 

解题思路:

1,通过判断ASCII码,判断出数字、大写和小写,不属于这三类的就是符号。

2,当满足其中三个命中的时候就符合,命中个数小于3则返回NG,后面操作都不进行。

3,通过双从循环判断是否有重复的,只需要判断三个字符就可以。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int myCmp(char *str, char *temp, int start, int len) {
    for(; start < len - 2; start++) {
        if(str[start] == temp[0] && str[start+1] == temp[1] && str[start+2] == temp[2])
            return 1;
    }
    return 0;
}
int main() {
    char str[32] = {};
    while(scanf("%s", str) != EOF) {
        int isCap = 0;
        int isLow = 0;
        int isNum = 0;
        int isSymbol = 0;
        int count = 0;
        //判断数据类型
        int len = strlen(str);
        if(len <= 8) {
            printf("NG\n");
            continue;
        }
        for(int i = 0; i < len; i++) {
            char temp = str[i];
            if(temp >= '0' && temp <= '9') isNum = 1;
            else if(temp >= 'A' && temp <= 'Z') isCap = 1;
            else if(temp >= 'a' && temp <= 'z') isLow = 1;
            else if(temp >= 33 && temp <= 126) isSymbol = 1;
            count = isCap + isLow + isNum + isSymbol;
            if(count >= 3) break;
        }
        if(count < 3) {
            printf("NG\n");
            continue;
        }
        int ret = 0;
        for(int i = 0; i < len - 2; i++) {
            for(int j = i+3; j < len; j++) {
                if(str[i] == str[j] &&
                   str[i+1] == str[j+1] &&
                   str[i+2] == str[j+2]) {
                    ret = 1;
                    break;
                }
            }
            if(ret) break;
        }
        if(ret) {
            printf("NG\n");
        } else {
            printf("OK\n");
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值