C++,查验身份证,用的是PAT码请,我不知道错哪了,请各位纠纠错

有人说我这代码错了,我找不到了,各位能帮我看看吗

//整体思路
//首先将前17位数字加权求和,计算的和模除11得到z码的值,对比M码判断身份证有效性 
//身份证错误不输出没有报错 
//输入第一行给出正整数N(<= 100)是输入的身份证号码的个数。 随后N行,每行给出1个18位身份证号码
#include 
main()
{
    int n;
    scanf("%d",&n);//判断几个 
    char c[n][18];
    char g=getchar();
    int j,i;
    for(j=0;jgets(c[j]);        
    int b[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//权重 
    int z[11]={0,1,2,3,4,5,6,7,8,9,10};//z码 
    char a[11]={'1','0','X','9','8','7','6','5','4','3','2'};//M码
    int m=1,l=0,p;
    for(j=0;jint s=0;
    for(i=0;i<17;i++)
    {
    if(c[j][i]=='X')
    {
    int h=10;
    s=s+h*b[i];
    continue;
    }
    s=s+((int)c[j][i]-48)*b[i];        
    }
    int t=s%11;    
    char f=a[t];
    int flag=0;    
    int k;
    if(f==c[j][17])
    flag=1;
    if(flag)
    {
    for(k=0;k<18;k++)
    printf("%c",c[j][k]);
    }
    printf("\n");m*=flag;
    if(m==1)
    {int v;v=(int)c[j][16];
    printf("passed\n");
    if(v%2==1) printf("male\n"); else printf("female\n");    
    }else {for(k=0;k<18;k++)
    printf("%c",c[j][k]);printf(" error\n");
    }
    }
    }