PTA7-29 删除字符串中的子串通俗双解法

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

输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。
输入样例:
Tomcat is a male ccatat
cat
输出样例:

Tom is a male

此题如果完全不用函数库解决,是很难解决的,这就是此题的难点所在,但是如果考虑到使用函数库,那么将会大大提高解题效率。本人结合网上答案,以下提供c语言和c++两个版本的代码,并附上详细注释。

c语言版:

#include<stdio.h>
#include<string.h>
int main ()
{
    char s1[81];
    char s2[81];
    char t[81];/*定义临时数组,因为strcpy, strcat 中的传入参数的内存地址不能重叠*/
    char *p;/*定义指针p,来接收匹配成功返回的地址*/
    gets(s1);
    gets(s2);
    while((p=strstr(s1,s2))!=NULL)/*找到s2在s1中第一次出现的首个字符位置,如果合法*/
    {
    	strcpy(t,p+strlen(s2));/*先将p所指位置偏移s2长度之后的所有字符拷贝到临时数组中*/
    	*p='\0';/*将p的内容置为结束符*/
    	strcat(s1,t);/*将t的内容接到s1末尾,这里是接在结束符之后,同时也会覆盖原结束符之后的字符,这样便完成了一次删除*/
    }
    puts(s1);
    return 0; 
}

c++版:

#include<iostream>  
#include<string>  
using namespace std; 
int main()
{ 
    string s1,s2;  
    int pos;
    getline(cin,s1);  
    getline(cin,s2);  
 /*找到s2在s1中第一次出现的首个字符位置,如果合法*/
    while ((pos=s1.find(s2))!=string::npos)  
    s1.replace(pos,s2.length(),"");  /*从找到的位置开始s2长度的字符串都用空串替代,完成一次删除*/
    cout<<s1;
    return 0;
}
鉴于此,我们在平时的练习中应多注意对函数库的使用,这样在以后的编程中才不至于浪费很多时间。

猜你喜欢

转载自blog.csdn.net/qq_37729102/article/details/80658727