这个为什么输出是乱码啊

#include <stdio.h>

#include <string.h>

int main()

{
char a[100], b[100], * p1, * p2, * p3, * p4, * temp;

//定义两个字符串数组

int ln_a, ln_b, s = 0, count1 = 0, count2 = 0, i, j, max = 0;

gets(a); //输入这两个字符串

    gets(b);

ln_a = strlen(a);

ln_b = strlen(b); //计算这两个字符串的长度

    p1 = a;

p3 = b;

for (i = 0; i < ln_a; i++)

{
    if((a[i] >= 'A' && a[i] <= 'Z') || (a[i] >= 'a' && a[i] <= 'z'))

    {
        p1 = p1 + i; //用指针 p1 记下字符串 a 中单词的首字母的地址

            while((a[i] >= 'A' && a[i] <= 'Z') || (a[i] >= 'a' && a[i] <= 'z'))

            //这个 whi l e 循环用来找出单词, 当字符不是字母时循环结束。

        {
            i++;

            //i ++用来看下一个字符是否为字母

            count1++; //记下测试了几个字符

        }

        p2 = p1 + count1 - 1; //用指针 p2 记下单词最后一个字母的地址, 。

            for (j = 0; j < ln_b; j++)

            {
                if((b[j] >= 'A' && b[j] <= 'Z') || (b[j] >= 'a' && b[j] <= 'z'))

                {
                    p3 = p3 + j; //用指针 p3 记下字符串 b 中单词的首字母的地址

                        while((b[j] >= 'A' && b[j] <= 'Z') || (b[j] >= 'a' && b[j] <= 'z'))

                        // 这个 whi l e 循环用来找出单词, 当字符不是字母时循环结束。

                    {
                        j++;

                        count2++;

                    }

                    p4 = p3 + count2 - 1;

                    //用指针 p4 记下单词最后一个字母的地址, 。

                    if(count1 == count2)

                        //如果 a 中单词与 b 中单词长度相等, 循环继续。

                    {
                        for (p1, p3; p1 <= p2; p1++, p3++)

                            //进行两个单词的字母比对。

                        {
                            if(*p1 == *p3)

                                //每当有一个单词相同, s 就++

                                s++;

                        }

                        if(s == count1 && s > max)

                            //如果 s==count1, 就意味着两个单词完全相等,

                        {
                            max = s;

                            //max 是相同单词长度, 如果 s>max 就进行替换

                            temp = p1;

                            //同时记下单词首字母地址, 以便输出。

                        }

                        j = ln_b + 1;

                        //一旦找到单词, 就不必在 b 字符串中继续找下一个单词了。

                    }

                }

            }

        s = j = count1 = count2 = 0; 

        //开始在 a 中找下一个单词, S, j, count1, count2 都要归零。

            /*for (p1; p1<=p2; p1++)

            pri ntf ("%c", *p1) ;

            pri ntf ("\n") ;

            count1=0; */

    }

}

printf("%d\n", max);

if(max > 0)

{
    for (i = 0, temp; i < max; i++)

        printf("%c", *(temp + i));

    printf("\n");

}

if(max == 0)

    printf("No common word! \n");

return 0;

}

30、53行为什么要将循环变量加1呢?写的好复杂啊。
题目是啥呢