题解 | #密码验证合格程序#
密码验证合格程序
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; }