m0_74426171 2022-12-14 08:45 采纳率: 0%
浏览 31

删除字符串中的子串段错误,如何解决?(语言-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<stdio.h>
#include<string.h>
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);
}


  • 写回答

2条回答 默认 最新

  • 於黾 2022-12-14 08:56
    关注

    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就离题万里

    评论

报告相同问题?

问题事件

  • 创建了问题 12月14日

悬赏问题

  • ¥15 程序实在不会写,要秃了
  • ¥15 pycharm导入不了自己的包
  • ¥15 C#.net通过内网url地址获取文件并下载问题,浏览器postman可以正常下载,用程序不行
  • ¥15 本人本科机械,目前研一。没有深度学习基础,目前对研究生课题一片迷茫,请教各位!
  • ¥15 关于R语言单因素与多因素线性回归的平均值
  • ¥15 服务器清除BIOS之后引导不了
  • ¥15 CPLEX用OPL编写的混合整数线性优化问题。
  • ¥15 可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?
  • ¥15 前端预览docx文件,文件从后端传送过来。
  • ¥15 层次聚类和蛋白质相似度