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