解题思路:

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");

        }

    }

}

点赞(3)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论