删除字符串中的子串段错误,如何解决?(语言-c语言)

问题:C语言初学者,过pta时一直有三个点显示段错误,有没有人可以解答一下,万分感谢。
思路:刚学习时没有学习strstr函数,就想着将字符串1一个一个扫描过去,与字符串2相同部分删除,删除通过将相同部分不放到字符串3中,不相同部分放到字符串3中,一次扫描完后在字符串3末尾加上‘\0’。然后再次扫描,直到没有相同.

输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。

输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。

输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。

输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male

#include
#include
int judge(char *p1,char *p2,int i,int *p3){
    int j,m=1;
    for(j=1;*(p2+j)!='\0';j++){
        i++;
        if(*(p1+i)==*(p2+j)){
            continue;
        }
        else if(*(p1+i)!=*(p2+j)){
            m=0;
            *p3=j;
            break;
        }
    }
    return m;
}
int shorten(char *s1,char *s2,char *s3,int length,int *m1){
    int i,j,n,judge2=1;
    n=0;
    for(i=0;*(s1+i)!='\0';i++){
        if(*(s1+i)!=*(s2)){
            if(*(s1+i)==' '&&*(s1+i-1)==' '){
                continue;
            }
            s3[n]=*(s1+i);
            n++;
            continue;
        }
        else if(*(s1+i)==*(s2)){
            if(judge(s1,s2,i,m1)==1){
                judge2=0;
                i+=length-1;
                continue;
            }
            else if(judge(s1,s2,i,m1)==0)
            {
                for(j=0;j<*m1;j++){
                    i=i+j;
                    if(*(s1+i)==' '&&*(s1+i-1)==' '){
                        continue;
                    }
                    s3[n]=*(s1+i);
                    n++;
                }
            }
        }
    }
    s3[n]='\0';
    if(judge2==0){
        shorten(s3,s2,s3,length,m1);
        return 0;
    }
    else if(judge2==1){
            return 0;
    }
}

int main(){
    char t1[100],t2[100],t3[100];
    int *n1;
    gets(t1);
    gets(t2);
    int length=strlen(t2);
    shorten(t1,t2,t3,length,n1);
    puts(t3);
}


if(judge(s1,s2,i,m1)==1)
else if(judge(s1,s2,i,m1)==0)
从这两句代码反复调用judge,就反映了你思维很混乱
你根本没有搞清楚到底应该如何删除子串,就着急写代码,代码也写的一团乱
推翻了重来吧
你的程序应该实现如下功能:
1.输入两个字符串s1,s2
2.遍历s1
3.从s1的每一个位置遍历s2的长度,判断是否与s2一致
4.如果不一致,跳出内层循环,继续匹配下一项
5.如果一致,那么循环的将s1中所有这个位置之后的字符向左移动,覆盖掉原来的字符,不要忘记移动最后的\0
6.移动过后索引要-1,以便于继续判断新串是否符合要求
7.输出s1,题目要求删除子串,你搞个s3就离题万里

仅供参考:

#include <stdio.h>
#include <string.h>
char s[256];
char *p;
int r,n,i;
int main() {
    while (1) {
        printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");
        fgets(s,256,stdin);
        if ('\n'==s[0]) break;
        p=s;
        while (1) {
            p=strstr(p,"%20");
            if (p) {
                memmove(p+1,p+3,strlen(p)-3+1);
                p[0]=' ';
            } else break;
        }
        p=s;
        while (1) {
            p=strstr(p,"你懂得");
            if (p) {
                memmove(p+6,p+6,strlen(p)-6+1);
                for (i=0;i<6;i++) p[i]='X';
            } else break;
        }
        printf("%s",s);
    }
    return 0;
}
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":
//abcdefg%20helloworld%20something.pdf
//abcdefg helloworld something.pdf
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":
//这是测试文字你懂得,在这个你懂的地方,就得做你懂得的事
//这是测试文字XXXXX,在这个你懂的地方,就得做XXXXX的事
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":
//