题解 | #密码验证合格程序#

密码验证合格程序

https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841

#include <stdio.h>
#include <string.h>

typedef struct element{
    int flag1; //大寫flag,0:no 1:yes
    int flag2; //小寫flag
    int flag3; //數字flag
    int flag4; //其他符號flag
} elm;

char *clip(int start, int len, char *input){
    static char str[100]={0}; //static是因為str在這裡是局部變量,他在其他函數中調用返回的地址時可能會失效、生命周期衰減。因此加埋static可以使得呢個地址固定不變
    int i;
    for (i=0; i<=len; i++)
    //因為len已經係長度啦,噉就直接 <= 而非用 < !!!!!
    {
        str[i] = *(input+start+i);
        // printf("i=%d\n",i);
    }
    str[i]='\0';
    // printf("ptr=%s\n",str);
    return str;
}

int main() {
    char str[100]={0};
    elm Element;
    while ( scanf("%s\n",str)!=EOF )
    {
        int len=strlen(str), i=0,j=0,a=0;
        int quest2=0, NGflag=0, n; //n為clip長度上限
        if (len<=8)
        {
            NGflag=1;
            // printf("checkpoint1 ");
            goto theEnd;
        }
        memset(&Element,0,sizeof(elm));
        for (i=0; i<len; i++)
        {
            if ( (str[i]>='A')&&(str[i]<='Z') ){
                Element.flag1=1;
            }
            else if ( (str[i]>='a')&&(str[i]<='z') ){
                Element.flag2=1;
            }
            else if ( (str[i]>='0')&&(str[i]<='9') ){
                Element.flag3=1;
            }
            else{
                Element.flag4=1;
            }
        }
        quest2 = Element.flag1 + Element.flag2 + Element.flag3 + Element.flag4;
        if (quest2<3){
            NGflag=1;
            // printf("checkpoint2 ");
            goto theEnd;
        }
        if (len%2==0) n=len/2;
        else    n=(len-1)/2;
        char clip1[100]={0}, clip2[100]={0};
        char  *p_c1=clip1, *p_c2=clip2;
        for (i=0; i<len-2; i++) //長度大於等於3,因此i<len-2
        {
            for (j=2; j<n; j++) //j即為長度 
            {
                if ((i+j)>=len)  break;
                p_c1 = clip(i,j,str);
                strcpy(clip1,p_c1); //因為p_c1指向嘅係函數內局部變量嘅地址,如果唔重新將地址指向嘅字符串賦值到我哋真正需要嘅clip1上、而係直接調用p_c1同埋p_c2,噉由於後便會重新調用clip函數來計算局部指針上對應嘅字符串、呢兩個其實最後就會指向完全相同嘅最新嘅字符串啦,就會出現"strcmp(p_c1,p_c2)==0"嘅情況啦
                for (a=0; a<len-j; a++) {
                    if((a>(i+j))||(a+j)<i) {
                        p_c2 = clip(a,j,str);
                        strcpy(clip2,p_c2);
                        // printf("p1=%s,p2=%s\n",p_c1,p_c2);
                        // printf("c1=%s,c2=%s\n",clip1,clip2);
                        // printf("i=%d,j=%d,a=%d:",i,j,a);
                        if (strcmp(clip1,clip2)==0) 
                        //呢度唔應該係p_c1同埋p_c2來strcmp,而應該係clip1同埋clip2來strcmp
                        {
                            NGflag=1;
                            break;
                        }
                    }
                }
                if (NGflag==1) break;
            }
            if (NGflag==1) break;;
        }
theEnd:
        if (NGflag==0) printf("OK\n");
        else printf("NG\n");
    }
    return 0;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务