PTA基础编程题目集 7-29 删除字符串中的子串 C语言

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;
}

  • 23
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值