您的位置:首页 > 其它

删除指定字符串中的子串

2015-08-02 16:02 281 查看

问题描述

在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。

要求实现函数:

int delete_sub_str(const char *str, const char *sub_str, int sub_str_num,char *result)

【输入】 str:输入的被操作字符串

sub_str:需要查找并删除的特定子字符串

sub_str_num:子字符串的长度

result:所要求的结果

【返回】 删除的子字符串的个数

示例

输入:str = "a1234bc123de12abc123d1234"

sub_str = "1234"

输出:result = "abc123de12abc123d"

返回:2

关键点:

在示例中,当主字符串循环到de12的时候,由于和字符串只是12两个字符相同,第3个字符不同,那么这个时候,只能把子字符串中的前两个字符拷贝到目标串中。

代码

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

int delete_sub_str(const char *str,const char *sub_str,int sub_str_len,char *result)
{
    int num=0,k=0;//num记录重复的子串个数,k用来记录result当前的位置
	int i=0,j=0;//i和j分别为str和sub_str指针
	const char *p_sub_str=sub_str;//p_sub_str用来还原sub_str到起始位置
	while(str[i]!='\0'){
		if(str[i]!=sub_str[j]){ 
		   result[k++]=str[i++];
		}else{
			const char *temp=sub_str;
			//此处的循环必须满足两个条件
			for(;(str[i]==sub_str[j])&&sub_str[j]!='\0';j++){
				i++;
			}
			if(j==sub_str_len){
				num++;//出现重复子串,num加1
			}
			else{
				//此处是关键
				//比如说字符串为1234;主字符串如果和子字符串前两个字符相同,但第三个字符不同
				//那么此时应该退出循环,并且把子字符串的前两个字符拷贝到result中去
                for(int m=0;m<j;m++){
					result[k++]=temp[m];
			
				}
			}
			//重新让子字符串回到起始位置
			sub_str=p_sub_str;
			j=0;
		}
	}
	return num;
}
int main()
{
	char *a="a1234bc123de12abc123d1234";
	char *b="1234";
	char c[100]={0};
	int sub_str_len=strlen(b);
	int i=delete_sub_str(a,b,sub_str_len,c);
	printf("Total deleted sub_str is %d\n",i);
	printf("%s\n",c);
	return 0;
}


其他变形

题目一:写一个字符串替换函数,如函数名为 StrReplace(char* strSrc, char* strFind, char* strReplace),strSrc为原字符串,strFind是待替换的字符串,strReplace为替换字符串。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: