题目描述
小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明对密码强度有一定要求:
1. 密码只能由大写字母,小写字母,数字构成;
2. 密码不能以数字开头;
3. 密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种;
4. 密码长度至少为8
现在小明受到了n个密码,他想请你写程序判断这些密码中哪些是合适的,哪些是不合法的。
输入描述:
输入一个数n,接下来有n(n≤100)行,每行一个字符串,表示一个密码,输入保证字符串中只出现大写字母,小写字母和数字,字符串长度不超过100。
输出描述:
输入n行,如果密码合法,输出YES,不合法输出NO
示例1
输入
1 CdKfIfsiBgohWsydFYlMVRrGUpMALbmygeXdNpTmWkfyiZIKPtiflcgppuR
输出
YES
实现代码:
注意:count一个变量每一个位代表不同含义,避免了多次定义变量提高内存消耗
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#pragma warning(disable : 4996)
int main()
{
char str[500] = { 0 };
char *p = NULL;
unsigned char count = 0x00; //4.5.6.7位表示条件1,2,3,4,,0.1.2表示数字,小写字母,大写字母是否出现,
int n = 0;
scanf("%d",&n);
getchar();
while (n)
{
gets(str);
p = str;
if (*p > '0'&&*p < '9') //条件2
{
count |= 0x20;
goto print; //条件不满足则直接跳转输出提高执行速度
}
if (strlen(p) < 8) //条件4
{
count |= 0x80;
goto print;
}
while ('\0' == *p) //遍历整个字符串查看数字字母的是否出现
{
//数字或者大小写字母出现相应位置1
if (
(*p > '0'&&*p < '9') || \
(*p > 'a'&&*p < 'z') || \
(*p > 'A'&&*p < 'Z')
)
{
if (*p > '0'&&*p < '9')
count |= 0x01;
if (*p > 'a'&&*p < 'z')
count |= 0x02;
if (*p > 'A'&&*p < 'Z')
count |= 0x04;
}
else //出现其他非法字符则条件1置1
{
count |= 0x10;
break ; //直接结束遍历
}
p++;
}
if (
((count & 0x01 == 1) && (count & 0x02 == 0) && (count & 0x04 == 0)) ||
((count & 0x01 == 0) && (count & 0x02 == 1) && (count & 0x04 == 0)) ||
((count & 0x01 == 0) && (count & 0x02 == 0) && (count & 0x04 == 1))
)
{
count |= 0x40;
}
print:{
if (
(count & 0xF0) == 0
)
printf("YES\n");
else
printf("NO\n");
}
n--;
count = 0; //标志变量清0
memset(str, 0, sizeof(str)); //清空输入字符数组
}
system("pause");
return 0;
}