解题思路:
1. 只能包含四种数据,那就需要对应四组数据的检查函数,前三个有库函数,只需要写一个最后的特殊字符检查。
2. 由于四中符号的检查过程相同,可以利用转移表简化代码。
注意事项:
转移表的定义与使用。
参照《C和指针》p263。
参考代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
//特殊字符数组
char arrGraph[] = "~!@#$%^";
//创建检查特殊数组的函数
int isGraph(int ch)
{
int totalLength = strlen(arrGraph);
for(int i = 0; i < totalLength; i++)
{
if(ch == arrGraph[i])
return 1;
}
return 0;
}
//转移表 函数指针数组 《C和指针》p263
static int (*testFunc[])(int) =
{
isupper,
islower,
isdigit,
isGraph
};
#define N_CATEGORYS ((sizeof(testFunc))/(sizeof(testFunc[0])))
#define N_LENGTHMIN 8
#define N_LENGTHMAX 16
int main()
{
int M;
if((scanf("%d",&M))!=1)
{
printf("Wrong input number\n");
return 0;
}
int m;
//char *password[100];
for(m = 0; m < M; m++)
{
char password[100];
if(scanf("%s",password) !=1 )
{
printf("Wrong input number\n");
return 0;
}
int lengthPass = (int)strlen(password);
if(lengthPass >= 8 && lengthPass <= 16)
{
int count[N_CATEGORYS] = {0};
int sumResult = 0;
for(int i = 0; i < lengthPass; i++)
{
for(int n = 0; n < N_CATEGORYS; n++)
{
if((count[n] !=1 ) && (testFunc[n](password[i])))
{
count[n] = 1;
}
}
}
for(int n = 0; n < N_CATEGORYS; n++)
{
sumResult += count[n];
}
if(sumResult >= 3)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
else
{
printf("NO\n");
}
}
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复