删除指定字符串中的子串

来源:互联网 发布:小程序域名白名单 编辑:程序博客网 时间:2024/05/19 18:13

问题描述 

在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。
要求实现函数: 
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为替换字符串。

0 0
原创粉丝点击