密码
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");
}
}
}