PTA 7-29 删除字符串中的子串

7-29 删除字符串中的子串

题目:

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

输入格式:

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

输出格式:

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

输入样例:

Tomcat is a male ccatat
cat

输出样例:

Tom is a male 
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
解法一:
#include<stdio.h>
#include<string.h>
int main()
{
    char s1[81];
    char s2[81];
    int i,j,k;
    int len;
    gets(s1);
    gets(s2);
    int count;//用来计算s1中是否和s2子串相等长度
    i= 0;
    len = strlen(s2);
    while(s1[i]!='\0')//遍历组数s1
    {
        if(s1[i]==s2[0])//如果s1i位置与s2初始字符相同,即有可能s1包含s2子串
        {    
            count = 0;
            //继续下一位的比较
            for(j=i;j<i+len;j++)
            {
                if(s1[j]==s2[j-i])
                {
                    count++;
                }
            }
            if(count==len)//如果相等结合上面for循环即子串存在
            {
                for(k=i+len;k<strlen(s1);k++)//把s1存在子串的初始位置替换成,去除s2字串后的字符(删除s1中的s2)
                {
                    s1[k-len]=s1[k];
                }
                s1[k-len]='\0';//重新设定s1的字符串大小
               i = 0;
            }
            else i++;//不存在s2,查找s1下一个是否匹配
        }
       else i++;//不存在s2,查找s1下一个是否匹配
    }

    puts(s1);

    return 0;
}
解法二:利用函数
#include<stdio.h>
#include<string.h>
int main()
{
    char s1[81];
    char s2[81];
    char s3[81];//定义一个临时字符数组用于存储s1除去某一次子串s2后面的字符串
    gets(s1);
    gets(s2);

    char *p;//定义一个定位指针,用于指向s2字串,第一次出现在s1的地址
    while((p=strstr(s1,s2))!= NULL)
    //while循环用来控制,s1中是否存在s2的字串。如果p==NULL则结束循环,无字串,否则p所指的位置就是s2字串第一次出现在s1的位置
    {
        strcpy(s3,p+strlen(s2));//把s1p所处的位置也就是s2第一次出现在s1的位置+s2字串=跳过s1中s2字串的位置,后面的字符存放在临时数字s3中
        *p='\0';//把s1p的位置设置成数组结束的标志,代表此时s1后面的字符已经被删除。
        strcat(s1,s3);//此时成立一个新的s1,进入循环判断是否还有字串
    }

    puts(s1);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值