求高手,解释难懂,不明白解决方案

求高手,解释难懂,不明白
#include<stdio.h>
#include<string.h>
void main()
{
char a[100][100]={' '},*p,*p1[20];
int i,j=0,l=0,k,c,ji=1,s=1;

for(j=0;j<100;j++)
for(i=0;i<100;i++)
{
scanf("%c",&a[j][i]);
if(a[j][i]=='0')
l++;
if(l==3)
{k=j; j=100;break;}
if(a[j][i]==' ')
break;

}
for(i=0;i<k;i++)
{
p1[i]=a[i];
}

  for(j=0;j<k;j++)
{ for(i=j+1;i<k;i++)

{

if(strcmp(p1[j],p1[i])==0)
ji++; }
for(c=0;c<j;c++)
{ if(strcmp(p1[c],p1[j])==0)
s=0;}
  if(s)
printf("%s %d \n",p1[j],ji);ji=1;

}
}
帮我一步步解释,一下,这程序很难懂;

------解决方案--------------------
C/C++ code
#include<stdio.h>
#include<string.h>
void main()
{
    char a[100][100]={' '},*p,*p1[20];
    int i,j=0,l=0,k,c,ji=1,s=1;

    for(j=0;j<100;j++)
        for(i=0;i<100;i++)
        {
            scanf("%c",&a[j][i]);       //  循环输入1万个字符......这丫的折腾人,存心的
            if(a[j][i]=='0')            //  要是输入了'0'字符就让l增量。
                l++;
            if(l==3)                    //  碰到3个0就退出循环,不干了。话说是人大概都不想干了。
                {k=j; j=100;break;}     //  退出前先把j的值记录在k里。
            if(a[j][i]==' ')            //  要是输入了空格,就退出内层循环。
                break;
        }                               //  整个来看,是想要人输入100组字符,每组都以空格结束。有个严重问题是字符串都没给填结束符的......
    for(i=0;i<k;i++)                    //  k里面一定有值吗?很怀疑啊。万一来个哥们就是认认真真地输入完100组字符,那个k不就是没有初值了吗?
    {
        p1[i]=a[i];                     //  呃,要把你输入的内容给倒到p1里,让它指向你输入的字符串们。可是p1才20位置啊!碰到上面说那个哥们儿咋办尼?
    }

    for(j=0;j<k;j++)                    //  又一次想要利用不知道可不可以利用的k
    {
        for(i=j+1;i<k;i++)              //  还来......

        {
            if(strcmp(p1[j],p1[i])==0)  //  要是p1[j]里面的字符串和p1[i]里面的相同,就让ji增量。想要找出后面有多少个和这个字符串重复的内容,我猜作者是这个意思
                ji++;                   //  那个问题是p1[j]里面哪来的字符串?呃,也许整个数组a里就被拼成了一个字符串,还是好不容易在遥远的地方撞上了一个'\0'
        }
        for(c=0;c<j;c++)                
        {
            if(strcmp(p1[c],p1[j])==0)  //  要是p1[c]与p1[j]里的字符串相同,那就把s变成0。
                s=0;                    //  这个,是为了看看前面是不是有相同的字符串吧
        }
        if(s)                           //  要是没找到相同的字符串,就输出这一串,还有ji的数字——这玩意,表达的是什么尼?
            printf("%s %d \n",p1[j],ji);    //  要是ji里面有值,唔,就是说后面还有和它相同的字符串的个数?
        ji=1;
    }
}           /* 真心猜不出这个程序想干啥,但多半它做不到想要做的事情 */