解题思路:

        1.定义三个数组,char数组a保存当前行的字符串 

                    int数组b判断字符是否存在 有则为1 无责为0

                    int数组c保存每一行的字符种类


注意事项:

        1.输入数字后需要getchar()吸收空格


新知识:

    gets()函数:

        从标准输入(键盘)读入一行数据,所谓读取一行,就是遇到换行符就返回。gets()函数并不    读取换行符'\n',它会把换行符替换成空字符'\0',作为c语言字符串结束的标志。

        gets()函数经常和puts()函数配对使用,puts()函数用于显示字符串,并自动在字符串后面添加一个换行标志'\n'


    memcpy函数:

        void *memcpy(void*dest, const void *src, size_t n);

           由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内


        用memcpy完成二维数组赋值和数组赋非0初值很方便的哦

    

参考代码:

#include<stdio.h>
#include<string.h>
int main()
{
    int n,j,i=0;            //n为行数,i,j为循环变量
    char a[100];            //a为字符型数组用来接收字符串
    int c[1000]={0},b[4]={0};   // c用来统计每行字符种类个数,b用来记录字符种类
    
    scanf("%d",&n);
    getchar();            //getchar()用来接收输入数字后的换行
     
    while(i++<n){                
        gets(a);            //读取一行     
        for(j=0;a[j]!='\0';j++){            //判断当前行字符种类
            if(b[0]==0&&a[j]>='0'&&a[j]<='9')
                b[0]++;
            if(b[1]==0&&a[j]>='a'&&a[j]<='z')
                b[1]++;
            if(b[2]==0&&a[j]>='A'&&a[j]<='Z')
                b[2]++; 
            if(b[3]==0&&(a[j]=='~'||a[j]=='!'||a[j]=='@'||a[j]=='#'||a[j]=='$'||a[j]=='%'||a[j]=='^'))
                b[3]++;
        }            //先判断b[]否为0,保证每种字符只执行一次b[]++
        
        if(j<8||j>16)        //判断长度
            ;
        else
            c[i-1]=b[1]+b[2]+b[3]+b[0];    //c[]保存每一行字符种类个数
            
        for(j=0;j<4;j++)            //b[]归零
            b[j]=0;
    }
    
    for(j=0;j<n;j++)            //输出
        printf("%s\n",c[j]>=3?"YES":"NO");
    return 0;
}


 

0.0分

0 人评分

  评论区

  • «
  • »