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