删除子串:只要是原串中有相同的子串就删除,不管有多少个,返回被删除的子串的个数,例如,输入原串“aabbccdd”,子串“bcc”,则返回1,删除子串后的内容为“aabdd”
要求实现函数:
int delete_sub_str(const char *str, const char *sub_str, char *out_buf, int out_buf_size);
【输出】 str:原串
sub_str:子串
out_buf_size:输出空间大小
【输入】 out_buf:删除子串后的内容
【返回】 删除子串的个数
思考:为什么需要out_buf_size这个参数?
#include <stdio.h>
#include <string.h>
int delete_sub_str(const char *str, const char *sub_str, char *out_buf, int out_buf_size)
{
if(str == NULL || sub_str == NULL || out_buf == NULL || out_buf_size == 0)
{
printf("error\n");
return -1;
}
if(strlen(str) == 0 || strlen(sub_str) == 0)
{
printf("--error--\n");
return -1;
}
int count = 0; //删除字符串的个数
int out_buf_i = 0; //输出字符串长度下标
int i = 0;
for(; i < strlen(str); i++)
{
if(str[i] != sub_str[0]) //遍历子串的字符,找到原串与子串一样的字符
{
out_buf[out_buf_i] = str[i];
out_buf_i++;
continue;
}
int str_flag = 0; //记录源字符串位置
int flag = 0; //记录位置
flag = out_buf_i;
str_flag = i;
int j = 0;
for(; j < strlen(str); j++)
{
if(i >= strlen(str))
break;
if(str[i] != sub_str[j])
break;
i++;
}
if(j == strlen(sub_str))
{
count++; //记录要删除的个数
}
else
{
//如果只有要删除字符串中的部分值,需要将out_buf更新
for(j = str_glag; j < i; j++)
{
out_buf[out_buf_i] = str[j];
//防止out_buf_size过小造成的越界,每次操作out_buf_i时都要进行判断
if(out_buf_i > out_buf_size)
{
printf("Array access out of bounds\n");
return -1;
}
out_buf_i++;
}
}
i--; //更新i,消除差1的错误
}
if(out_buf_i > out_buf_size)
{
printf("Array access out of bounds\n");
return -1;
}
out_buf[out_buf_i] = '\0';
return count;
}
int main()
{
const char *str = "aabbccdd";
const char *sub_str = "bcc";
char out_buf[strlen(str)+1];
memset(out_buf, 0, sizeof(out_buf));
int num = delete_sub_str(str, sub_str, out_buf, sizeof( out_buf));
printf("str:%s\n",str);
printf("sub_str:%s\n",sub_str);
printf("out_buf:%s\n",out_buf);
printf("num:%d\n",num);
return 0;
}
out_buf_size这个参数起到保护作用,防止下标越界。