7-29 删除字符串中的子串
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。
输入样例:
Tomcat is a male ccatat cat
输出样例:
Tom is a male
思路分析:
题理解起来不难,但实现还是有点难度的。
1.用gets()函数接收这两个字符串数组,gets()用来接收字符串很好用噢!
2.计算s1 s2的长度
3.遍历s1数组,当s1 与s2相同时,再通过while循环来判断后续几个字符是否也相同
4.若相同,就进行逻辑上的删除,即把s1[i]的值更新:s1[i]=s1[i+L2],L2是s2的长度
5.删除完之后L1的长度要减去L2;然后遍历的 i 回溯到相同字符之前
6.循环完毕,之后输出L1(这里L1是逻辑删除之后的长度)长度的字符
代码也有注释,可以看看噢。
代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
char s1[81],s2[81];
gets(s1);
gets(s2);
int L1=strlen(s1),L2=strlen(s2);
int flag=0,i,j=0;//flag用来标志s1与s2相同的第一位,s1的位置下标
for(i=0;i<L1;i++){//L1的长度没经过一次删除就会改变
if(s1[i]==s2[j]){
flag=i;
while(s1[i]==s2[j]&&i<L1){
i++;
j++;
}
if(j>=L2){//当遍历完s2的时候就能进行删除操作
for(int k=flag;k<L1-L2;k++){
s1[k]=s1[k+L2];
}
i=flag-L2;//删除相同的字符串,i要回到开始相同的地方
j=0;
L1=L1-L2;
}
else{
i=flag;//同理,当遍历到ccat时,第二个c与s2中第二位不同,i要回溯
j=0;
}
}
}
for(i=0;i<L1;i++){
printf("%c",s1[i]);
}
return 0;
}