problem description:
(1).密码长度大于等于8,且不要超过16。
(2).密码中的字符应该来自下面“字符类别”中四组中的至少三组。
这四个字符类别分别为:
1.大写字母:A,B,C…Z;
2.小写字母:a,b,c…z、
3.数字:0,1,2…9;
4.特殊符号:~,!,@,#,$,%,^;
思路:要求1容易实现,要求2需要分为两部分实现。
第一部分:首先判断字符是不是来自四个字符类别的,否定的话直接整串密码不合格。
第二部分:判断字符串中是否满足四组中至少三组的的要求。可以给每个字符类别设定一个flag,最后进行统计。
第二部分的思路:首先为四类字符各设定一个flag,读入字符,先判断是否属于四组中的一组,如果属于则将这组的flag设为1,不属于则跳出循环且否定密码。字符串判断完毕之后将四个flag相加,若果大于等于3则密码符合要求。
小写的字母ASCII码大于大写字母的ASCII码
大写字母 65~90 90-65+1=26
小写字母 97~122
数字 48~57
for循环第一次先赋值、判断、执行语句、执行++
第二判断、执行语句、执行++
直到判断为假则跳出
gets()是读到回车并且把回车读进来然后抛掉,遇到空格也可以读取。
犯了几个错误
scanf()读数字时会吧回车留在缓冲区中,使用gets()读入时会把它读进来并且抛掉,这样gets()就等于没读到东西。
代码如下:
#include <stdio.h>
#include <string.h>
#define MAX 1024
int main(){
int m,i,len,q;
char a[MAX];
int flag1,flag2,flag3,flag4,sum;
scanf("%d", &m);
getchar();//用来将scanf()剩下的回车抛掉
for(i=0;i<m;i++){
flag1=0;flag2=0;flag3=0;flag4=0;sum=0;
gets(a);
len=strlen(a);
if(len>=8 && len<=16){
for(q=0;q<len;q++){
if(a[q]>=65 && a[q]<=90){
flag1=1;//the character is capital(大写字母)
}else if(a[q]>=97 && a[q]<=122){
flag2=1;//the characte is lower case(小写字母)
}else if(a[q]>=48 && a[q]<=57){
flag3=1;//0~9的数字
}else if(a[q]=='~'||a[q]=='!'||a[q]=='@'||a[q]=='#'||a[q]=='$'||a[q]=='%'||a[q]=='^'){
flag4=1;//特殊字符判断
}else{
break;
}
}
sum=flag1+flag2+flag3+flag4;
if(q==len && (sum>=3))
printf("YES\n");
else
printf("NO\n");
}else{
printf("NO\n");
}
}
}