删除串s1中所有s2字串

特别注意的如下图

 

caabcbc 删除 abc 后 cabc 仍有 abc 显然 还得 删除 abc结果为 c。

然后 向前 覆盖 子串 一样的 长度,覆盖结束(删除),末尾也 清零 子串一样 的长度

删除串s1中所有s2字串 

code:

/*
删除串s1中所有s2字串 
*/

#include <stdio.h>
#include <string.h>

//打印 
void prin_array(char a[])
{
	for(int i = 0;a[i] != '\0';i ++)
	{
		printf("%c",a[i]);
	}
	printf("\n"); 
	return;
}

//找到在子串在主串的位置,传入 两个 数组 变量, 进行 遍历比对 
int index(char a[],char b[])
{
	//如果 传入的 数组 不符合 要求,直接 返回 
	if( *a == '\0' && b[0] == '\0' )
	{
		return -1;
	}
	
	
	//j 用来 保存 字串 
	int j = 0;
	for(int i = 0;a[i] != '\0';i ++)
	{
		if(a[i] == b[0])
		{
			for(j = 0;b[j] != '\0' && a[i + j] != '\0';j ++)
			{
				if(b[j] != a[i + j])//字串 和 主串 对比 
				{
					break;
				}
			}
			//说明 字串 已经遍历 到尾了,配对成功 
			if(b[j] == '\0')
			{
				return i;
			}
		}
	}
	
	return -1;
}

void delete_Son(char a[],char b[])
{
	int len_b = strlen(b);//获取 子串 长度 
	int flag = 0;
	
	int len_a = strlen(a);//获取 主串 长度 
	char c[len_a] = {0};//用来 保存 主串 的值 
	
	strcpy(c,a);//把a值 赋值在c中,给 c 便于修改 
	prin_array(a);
	prin_array(b);
	
	while(1)
	{
		flag = index(c,b);
		if(flag == -1)
		{
			break;
		}
		
		int i = flag;
		//当然 覆盖 后 的数组 也必须 保证 没有 子串 
		for(i = flag;i < len_a - len_b;i ++)//往前 覆盖(代替删除)如:abcdfg -> dfgdfg
		{
			c[i] = c[i + len_b];//i + len_b + 1 = len_a -> i < len_a -lenb
		}
		
		for(int j = i;c[j] != '\0';j ++)//向前移动成功,然后再把末尾清空个数 为子串长度 的元素:dfgdfg -> dfg'\0''\0''\0'
		{
			c[j] = '\0';
		}
		
		
	}

	//打印 结果字符数组
	prin_array(c);
	
	return;
}


int main()
{
	//测试 主串 和 字串 
	char *a = "caabcbcfabccabcccxdsa";//主串 
	char *b = "abc";//等价于 b[3] = {'a','b','c'},但前者 不能修改其中某个元素,只能整体修改,查看,后者方便修改 
	
	delete_Son(a,b);
	
	return 0;
}

おすすめ

転載: blog.csdn.net/qq_47991812/article/details/121389082