【C++】删除字符串中的子串

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

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

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

输入样例:

Tomcat is a male ccatat
cat

输出样例:

Tom is a male

程序代码1:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char* f1(char a[],char b[]);     
void del(char a[],char b[]);
int main()
{
    char a[80];
    char b[80];
    //fgets(a,80,stdin);
    //fgets(b,80,stdin);
    gets(a);
    gets(b);
    del(a,b);
    cout<<a;

    return 0;
}
char* f1(char a[],char b[])
{
    int i=0;
    int j=0;
    int k=0;
    for(i=0;a[i]!='\0';i++)
    {

        if(a[i]==b[0])
            {
                k=i+1;
                for(j=1;a[k]==b[j]&&a[k]!='\0'&&b[j]!='\0';k++,j++);
                if(b[j]=='\0')
                    return a+i; 
            }   

    }
    return 0;
}
void del(char a[],char b[])
{
    char* p;
    while(p=f1(a,b))
        strcpy(p,p+strlen(b));
}

程序代码2:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char* f1(char a[],char b[]);     
void del(char a[],char b[]);
int main()
{
    char a[80];
    char b[80];
    fgets(a,80,stdin);
    fgets(b,80,stdin);
    //gets(a);
    //gets(b);
    del(a,b);
    cout<<a;

    return 0;
}
char* f1(char a[],char b[])
{
    int i=0;
    int j=0;
    int k=0;
    //for(i=0;a[i]!='\n';i++)
    for(i=0;a[i]!='\0';i++)
    {

        if(a[i]==b[0])
            {
                k=i+1;
//for(j=1;a[k]==b[j]&&a[k]!='\0'&&b[j]!='\0';k++,j++);
                for(j=1;a[k]==b[j]&&a[k]!='\n'&&b[j]!='\n';k++,j++);
                //if(b[j]=='\0')
                if(b[j]=='\n')
                    return a+i; 
            }   

    }
    return 0;
}
void del(char a[],char b[])
{
    char* p;
    while(p=f1(a,b))
        //strcpy(p,p+strlen(b))
        strcpy(p,p+strlen(b)-1);
}

注意:

  上面两段代码有5处不同。

  代码1用gets()函数来输入字符串,代码2用fget()函数来输入字符串。gets()函数在换行时结束输入,不会把’\n’纳入字符串内容,fget()函数也是在换行时结束输入,但是会把’\n’作为字符串内容的一部分。
  
例如有以下输入:

Hello world(换行)

执行gets(a)和fgets(a,80,stdin)得到的结果是:


两者的区别就在此。正是因为这个区别,所以导致了两段代码后面四处的不同。

两段代码运行结果稍微有点区别:

代码1结果:

代码2结果:

可见代码2的运行结果比代码1多了一个空行,原因就是fgets(a)的时候a的末尾有一个’\n’。

全部评论

相关推荐

想润的芹菜人狠话不多:把其中一个老总放中间都会得罪另一个
点赞 评论 收藏
分享
面试摇了我吧:啊哈哈面试提前五个小时发,点击不能参加就是放弃
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务