1. 删除字符串中所有给定的子串(40分)
问题描述:
在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。
要求实现函数:
int delete_sub_str(const char *str, const char *sub_str, char *result_str)
【输入】 str:输入的被操作字符串
sub_str:需要查找并删除的特定子字符串
【输出】 result_str:在str字符串中删除所有sub_str子字符串后的结果
【返回】 删除的子字符串的个数
注:
I、 子串匹配只考虑最左匹配情况,即只需要从左到右进行字串匹配的情况。比如:
在字符串"abababab"中,采用最左匹配子串"aba",可以匹配2个"aba"字串。如果
匹配出从左到右位置2开始的"aba",则不是最左匹配,且只能匹配出1个"aba"字串。
II、 输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。
示例
输入:str = "abcde123abcd123"
sub_str = "123"
输出:result_str = "abcdeabcd"
返回:2
输入:str = "abcde123abcd123"
sub_str = "1234"
输出:result_str = "abcde123abcd123"
返回:0
/******************************************************************************
编程思路:
1.在子函数中申请空间接受str传过来的参数
2.用strstr找到子字符串的位置,找到以后计数,并跳过这段字符串,将后面的连接到字符串中
p[i] = '\0';
strcat(p, pos+len);
3.拷贝值到result_str并返回。
注意点:
1.因为const char *str给的是const,所以在函数体内要有个指针将其传进来,并要给这个指针分配空间
2.char *result_str是返回的变量,所以要修改其指向的值,而不是直接将result_str = p
用strcpy最简单。用memcpy也可以,memcpy是从源src所指的内存地址的起始位置开始拷贝
n个字节到目标dest所指的内存地址的起始位置中,并且不会在最后一位加上‘\0’,所以调用
result_str[strlen(p) ] = '\0';
出错的地方:
1.strcpy没有为p申请内存
用数组或malloc
2.result_str没有正确的返回
错的第一次没有在result_str = p,但是result_str不是返回值,所有要修改其指针
第二次的话修改了一下函数接口,但是总是出问题
3.因为返回参数给的是char *result_str,所以用
*******************************************************************************/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~方法1~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
#include<stdio.h>
-
#include<string.h>
-
-
int delete_sub_str(const char *str, const char *sub_str, char *result_str)
-
{
-
char *pos;
-
int len, count, len1;
-
int i;
-
char *p;
-
-
len1 = strlen(str);
-
-
p = (char *)malloc(sizeof(char) * (len1+1));
-
-
strcpy(p, str);
-
-
count = 0;
-
-
len =strlen(sub_str);
-
-
while((pos = strstr(p, sub_str)) != NULL)
-
{
-
count ++;
-
i = pos - p;
-
-
p[i] = '\0';
-
strcat(p, pos+len);
-
}
-
-
strcpy(result_str, p);
-
//memcpy(result_str, p, strlen(p));
-
//result_str[strlen(p) ] = '\0';
-
printf("%s\n", result_str);
-
-
free(p);
-
-
return count;
-
}
-
-
int main(int argc, char** argv)
-
{
-
const char *input = "hello_world_hello";
-
-
char *output = NULL;
-
char *sub_str = "llo";
-
int i = 0;
-
-
int len1 = strlen(input);
-
-
output = (char *)malloc(sizeof(char) * (len1+1));
-
-
i = delete_sub_str(input, sub_str, output);
-
-
printf("result = %s, count = %d", output, i);
-
while(1);
-
free(output);
-
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~方法2~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
#include<stdio.h>
-
#include<string.h>
-
-
int delete_sub_str(const char *str, const char *sub_str, char **result_str)
-
{
-
char *pos;
-
int len, count, len1;
-
int i;
-
char *p;
-
-
len1 = strlen(str);
-
-
p = (char *)malloc(sizeof(char) * (len1+1));
-
-
strcpy(p, str);
-
// while(*str != '\0')
-
// *p++ = *str++;
-
count = 0;
-
-
len =strlen(sub_str);
-
-
while((pos = strstr(p, sub_str)) != NULL)
-
{
-
count ++;
-
i = pos - p;
-
-
p[i] = '\0';
-
strcat(p, pos+len);
-
}
-
-
*result_str = p;
-
printf("%s\n",*result_str);
-
-
return count;
-
}
-
-
int main(int argc, char** argv)
-
{
-
const char *input = "hello_world_hello";
-
-
char *output = NULL;
-
char *sub_str = "llo";
-
int i = 0;
-
-
// int len1 = strlen(input);
-
-
// output = (char *)malloc(sizeof(char) * (len1+1));
-
-
i = delete_sub_str(input, sub_str, &output);
-
-
printf("result = %s, count = %d", output, i);
-
while(1);
-
free(output);
-
}
阅读(982) | 评论(0) | 转发(0) |