求3个字符串的最长公共子串程序出错

#想把每个字符串的所有子串都用二维数组存起来,结果二维数组的输出结果包含乱码,运行结果也不正确是为什么?

//三个的最长公共子串
#include<stdio.h>
#include<string.h>
#define N 100
int fun(char a[N],char *b[N][50])//二维数组存储子串
{
    char *p=a,*q,temp[N];
    char *t;
    int i,k=0;
    while(*p!='\0')//取子串的起始位置
    {
        i=0;//i=子串的长度-1
        while(*(p+i)!='\0')//长度不超过原来字符串尾
        {
            t=temp;//temp用于暂时存放取出的子串
            for(q=p; q<=p+i ;q++,t++)//q用来遍历取子串
            {
                *t=*q;//往t里存子串
            }
            *t='\0';//给temp加结束符
            strcpy(b[k++],temp);//把一个子串赋给二维数组b的一层
            i++;//长度加1
        }
        p++;//起始位置后移1
    }
    return(k);//返回b中子串个数
}

void output(char a[N][50])
{
    int i;
    for(i=0;i<N;i++)
    {
        puts(a[i]);
    }
}

int main()
{
    char a[N],b[N],c[N],aa[N][50],bb[N][50],cc[N][50],ch[50];
    int i,len1,j,len2,k,len3,max=0;
    printf("a:");
    gets(a);
    printf("b:");
    gets(b);
    printf("c:");
    gets(c);//用户输入

    len1=fun(a,aa);
    len2=fun(b,bb);
    len3=fun(c,cc);//求出所有子串

    output(aa);//测试输出,结果执行有很多乱码


    printf("%d %d %d\n",len1,len2,len3);
    for(i=0;i<len1;i++)
        for(j=0;j<len2;j++)
            for(k=0;k<len3;k++)
                if( strcmp(aa[i],bb[j])==0 && strcmp(aa[i],cc[i])==0 )
                    if(strlen(aa[i])>=max)
                    {
                        max=strlen(aa[i]);
                        strcpy(ch,aa[i]);
                    }
    printf("最长共同单词为:%s",ch);
    return 0;
}


img