解题思路:

    用指针数组保存每个密码的首地址,遍历每个密码的每个字符,用flag数组标志每种密码类型,1表示有该种密码,0表示没有


注意事项:
    指针数组注意分配足够大的空间,不然会出段错误


参考代码:

#include<stdio.h>

#include<string.h>

#include<stdlib.h>


int flag[4]={0};

int count()

{

     int k,n=0;

     for(k=0;k<4;k++)

         if(flag[k]==1)

             n++;

     return n;

}

int main(int argc,char* argv[])

{

     int n,i,j,t=0,k;

     scanf("%d",&n);

     char* str[10]={0};

     char a[500]={0};

    for(i=0;i<n;i++)

    {

         str[i]=a+t;

         scanf("%s",str[i]);

         t=t+50;

    }


     for(i=0;i<n;i++) //遍历每一组密码

     {

         if(strlen(str[i])<8 && strlen(str[i])>16) //(1).密码长度大于等于8,且不要超过16。

              printf("NO\n");

         else

         {

             memset(flag,0,16);

             for(j=0;j<strlen(str[i]);j++) //遍历一组密码每个字符,“字符类别”中四组中的至少三组。

             {

                 if(*(str[i]+j)>='A' && *(str[i]+j)<='Z')

                     flag[0]=1;

                 if(*(str[i]+j)>='a' && *(str[i]+j)<='z')

                     flag[1]=1;

                 if(*(str[i]+j)>='0' && *(str[i]+j)<='9')

                     flag[2]=1;

                 if(*(str[i]+j)=='~' ||*(str[i]+j)=='!'|| *(str[i]+j)=='@'|| *(str[i]+j)=='#'|| *(str[i]+j)=='$'|| *(str[i]+j)=='%'|| *(str[i]+j)=='^')

                     flag[3]=1;

             }

             if(count()>=3)

                  printf("YES\n");

             else

                 printf("NO\n");

         }

    }

     return 0;

}


点赞(0)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论