二维字符数组使用问题

#include
int main(){
char a[100][19];
int n;
int i,j;
int sum;
int b[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char c[11]={'1','0','X','9','8','7','6','5','4','3','2'};
int flag=1;

scanf("%d",&n);
for(i=0;i<n;i++)
** scanf("%s", a[i]);**//这里的a[i]是什么意思,a已经定义成二维数组了,是省略了行长度吗?默认行长度是0?

for(i=0;i<n;i++){
    sum=0;
    for(j=0;j<17 && a[i][j]-'0'>=0 && a[i][j]-'0'<=9 ;j++){

            sum+=b[j]*(a[i][j]-'0');
        }
        if(j!=17 || a[i][17]!=c[sum%11]){
            flag=0;
            printf("%s\n", a[i]);//输出有问题的字符串 
        }
    }

if(flag==1)
    printf("All passed");

return 0;

}

 scanf("%s", a[i])
相当于
scanf("%s", &a[i][0]);

数组的地址和数组首元素的地址是一样的,传递数组给函数,数组退化成指针。

二维数组么,a[i]代表第i行的地址

a[i]代表行的地址,你定义的有100行,如果你输入的n为20,那么你输入的字符类型的全部放在a[0][0]-a[19][0]中,其他的数组里面都是空的