判断密码是否合法

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");
		}
	}
	
} 
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值