删除字符串中的子串 (20分)
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
#输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。
输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male
第一种方法:用到库函数strstr();
需要用到#include<string.h>
##弄懂这个代码必须了解前面的库函数
#include<stdio.h>
#include<string.h>
int main(){
char s1[81],s2[81];
gets(s1);
gets(s2);
char *p;
char tmp[81];
while((p=strstr(s1,s2))!=NULL){
*p='\0'; //作为字符串的结尾
strcpy(tmp,p+strlen(s2)); //p跳过s2的长度,将后面的字符复制给tmp
strcat(s1,tmp);
//再把前面的和p删掉前面第一次的s2连接,再检查s1里还有没有s2子串。
}
puts(s1);
return 0;
}
第二种方法:没有调用库函数,会比较复杂点,但自己写一下,还是可以理解的。
#include<stdio.h>
int main(){
char s1[81],s2[81];
int i=0,j=0,count=0;
gets(s1);
gets(s2);
while(s1[i]!='\0'){
if(s2[count]==NULL&&count>0){
j=i-count;
while(s1[i]!='\0'){
s1[j++]=s1[i++];
//删除操作,相当于后面的字符取代前面的。
}
s1[j]=NULL;
i=0;
count=0;
continue;
}
if(s1[i]==s2[count])
count++;
else if(s1[i]==s2[0]) //避免错过了ccatat;
count=1;
else
count=0;
i++;
}
if(s2[count]==NULL&&count>0)
s1[i-count]=NULL;
puts(s1);
return 0;
}