大致思路:
输入N个字符串为密码,可以通过编写一个函数(Passnumber
)获得一个密码的信息(密码长度,字符类别),再在主函数用循环判断每个密码是否符合安全密码的要求,符合则输出YES,否则输出NO。
那么接下来主要就是考虑怎么编写Passnumber这个函数了。首先,可以直接用strlen()
函数求得密码长度,再用这个函数返回密码字符类别数。
这里,我觉得关键在于求密码字符类别数。我是通过指针p遍历每个字符,判断其类别,用a[4]数组表示四种字符类别数,一种字符类别就在相应的a[i]中加1,最后只需统计a[4]中不为0的数有几个即为密码中字符类别数。当然,这里不用指针也是一样的做法。
注意
涉及到字符及字符串输入输出的问题要注意是否需要换行符的吸收
扩展
scanf函数做输入以换行符结束会留下这个换行符在输入缓冲区而不是把这个换行符清除掉。如果后面又跟了个scanf的话,它会把这个换行符过掉。如果下次输入时使用的是gets、fgets等函数输入字符串,则下次输入不会过掉这个换行符,会把这个换行符作为输入值,所以这时要注意吸收换行符,可以用getchar()进行吸收。另外,gets和fgets函数做输入以换行符结束会把这个换行符清除掉,不会在输入缓冲区留下这个换行符。
知道以上知识编写代码就容易了,以下是代码:
#include <stdio.h>
#include <string.h> //求字符串长度的strlen()函数需要包含这个头文件
int Passnumber(char str[50]);
int main()
{
int N,i,len;
scanf("%d",&N);
char ch[N][50]; //二维字符数组,表示有N个长度不大于50的密码
getchar(); //这里要吸收输入N之后的那个换行符
for (i=0;i<N;i++){ //输入N个密码样例
fgets(ch[i],50,stdin);
len=strlen(ch[i]); //用strlen求得密码长度
if (len<8||len>16){
printf("NO\n");
}
else{
if (Passnumber(ch[i])>=3) //Passnumber返回字符类别数
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}
int Passnumber(char str[50])
{
int i,count=0,a[4]={0}; //count是字符类别数,a[4]用于收集不同的字符数,并初始化为0
char c[8]="~!@#$%^",*p=str; //这里用指针处理密码较为方便
while (*p!='\0'){ //遍历密码的所有字符并判断
if (*p>='A'&&*p<='Z')
a[0]++;
else if (*p>='a'&&*p<='z')
a[1]++;
else if (*p>='0'&&*p<='9')
a[2]++;
for (i=0;i<7;i++){
if (*p==c[i])
a[3]++;
}
p++;
}
for (i=0;i<4;i++){
if (a[i]>0)
count++; //只要a[i]>0就说明密码中含有这一字符类别
}
return count; //最后返回密码字符类别数
}
有什么问题可以留言哦~。
0 分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复