hdoj 2043

密码
 

Problem Description

网上流传一句话:"常在网上飘啊,哪能不挨刀啊~"。其实要想能安安心心地上网其实也不难,学点安全知识就可以。
首先,我们就要设置一个安全的密码。那什么样的密码才叫安全的呢?一般来说一个比较安全的密码至少应该满足下面两个条件:
(1).密码长度大于等于8,且不要超过16。
(2).密码中的字符应该来自下面“字符类别”中四组中的至少三组。
这四个字符类别分别为:
1.大写字母:A,B,C...Z;
2.小写字母:a,b,c...z;
3.数字:0,1,2...9;
4.特殊符号:~,!,@,#,$,%,^;
给你一个密码,你的任务就是判断它是不是一个安全的密码。
 

 

Input
输入数据第一行包含一个数M,接下有M行,每行一个密码(长度最大可能为50),密码仅包括上面的四类字符。
 

 

Output
对于每个测试实例,判断这个密码是不是一个安全的密码,是的话输出YES,否则输出NO。
 

 

Sample Input
3
a1b2c3d4
Linle@ACM
^~^@^@!%
 

 

Sample Output
 
NO
YES
NO

 

 

这题是昨晚开始写的 也卡了挺久 但这题真的挺简单 不应该在这边浪费这么多时间的

我反思了一下自己的问题

不够细心 if语句里面是两个等号 同样的错误在一题里面犯了两遍 改了第一个if之后应该再检查一下其他的if语句有没有错误的

还有就是一开始用的是gets语句  在无数次错误之后终于去翻了一下书 puts是不需要加换行符的 哦我记住了 可是这跟我的gets又有什么关系呢55 我看了下gets也是以回车结束输入呀aaaa 留一个疑惑在这里吧 等以后更加厉害了应该就能知道为什么了吧

最后我改成了scanf就ac了

还有一个疑惑就是 我看别人写的用了if elseif elseif else 也就是说 除了大写字母和小写字母和数字以外的所有特殊字符都被记入到其中 这是不是跟题意不符

代码:

#include<stdio.h>
#include<string.h>
void main()
{
    char s[51];
    int flag,count[4];
    int n,i;
    while(scanf("%d",&n)!=EOF)
    {
        while(n--)
        {
            flag=1;
            count[0]=0;
            count[1]=0;
            count[2]=0;
            count[3]=0;
            gets(s);
            if(strlen(s)<8||strlen(s)>16)
                flag=-1;
            for(i=0;i<strlen(s);i++)
            {
                if(s[i]<='Z'&&s[i]>='A')
                    count[0]=1;
                if(s[i]<='z'&&s[i]>='a')
                    count[1]=1;
                if(s[i]<='9'&&s[i]>='0')
                    count[2]=1;
                if(s[i]=='~'||s[i]=='!'||s[i]=='@'||s[i]=='#'||s[i]=='$'||s[i]=='%'||s[i]=='^')
                    count[3]=1;
            }
            if(count[0]+count[1]+count[2]+count[3]<3)
                flag=-1;
            if(flag==-1)
                printf("NO\n");
            else
                printf("YES\n");
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值