输入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; }鉴于此,我们在平时的练习中应多注意对函数库的使用,这样在以后的编程中才不至于浪费很多时间。