7-29 删除字符串中的子串 (20分)
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。
输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* mydelete(char *s1,char *s2,char* result);
int main() {
char *s1=(char*)malloc(81*sizeof(char));//长度为80的字符串数组 :要考虑到最后结尾的0,最大长度应该是81
char *s2=(char*)malloc(81*sizeof(char));//长度为80的字符串数组
char *result= (char*)malloc(81*sizeof(char));
gets(s1);//可读入带空格的字符串
gets(s2);
mydelete(s1,s2,result);//从s1中删除s2,最后将结果存在 result
while(strlen(result)!=strlen(s1))//是s1和result不相等,则说明删除了一些信息
{
strcpy(s1,result);//把结果复制给s1
mydelete(s1,s2,result);//从s1中删除s2,最后将结果存在 result
}
printf("%s",s1);
free(s1);
free(s2); //释放内存
return 0;
}
char* mydelete(char *s1,char *s2,char* result)
{
int i=0;
int length=0;
while(s1[i]!=0)//从s1中删除字符串s2
{
int j=0;
int k=i;
bool findsame=false;
if(s1[i]==s2[j])//找到和s2第一个字符相同的点
{
k++;//判断接下来是不是相同
j++;
while(s2[j]!=0)
{
if(s1[k]==s2[j])//相同则一直往后遍历
{
k++;
j++;
}
else//有不相同的则跳出循环
{
break;
}
}
if(s2[j]==0)//表明遍历完了整个s2且s2和s1的这部分相同
{
findsame=true;
}
}
if(!findsame)
{
result[length]=s1[i];
length++;
i++;
}
else//找到了相同的部分则s1要跳过这部分
{
i=k;
result[length]=s1[i];
length++;
i++;
}
result[length]=0;//字符串以0结尾
}
return result;
}