Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1292409
  • 博文数量: 168
  • 博客积分: 2124
  • 博客等级: 大尉
  • 技术积分: 2590
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-16 23:51
文章分类

全部博文(168)

文章存档

2014年(6)

2013年(74)

2012年(71)

2011年(17)

分类: LINUX

2013-08-06 13:44:59

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~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<string.h>

  3. int delete_sub_str(const char *str, const char *sub_str, char *result_str)
  4. {
  5.     char *pos;
  6.     int len, count, len1;
  7.     int i;
  8.     char *p;

  9.     len1 = strlen(str);

  10.     p = (char *)malloc(sizeof(char) * (len1+1));

  11.     strcpy(p, str);

  12.     count = 0;
  13.     
  14.     len =strlen(sub_str);
  15.     
  16.     while((pos = strstr(p, sub_str)) != NULL)
  17.     {
  18.         count ++;
  19.         i = pos - p;
  20.         
  21.         p[i] = '\0';
  22.         strcat(p, pos+len);        
  23.     }
  24.         
  25.     strcpy(result_str, p);
  26.     //memcpy(result_str, p, strlen(p));
  27.     //result_str[strlen(p) ] = '\0';
  28.     printf("%s\n", result_str);

  29.     free(p);

  30.     return count;
  31. }

  32. int main(int argc, char** argv)
  33. {
  34.     const char *input = "hello_world_hello";

  35.     char *output = NULL;
  36.     char *sub_str = "llo";
  37.     int i = 0;
  38.     
  39.     int len1 = strlen(input);

  40.     output = (char *)malloc(sizeof(char) * (len1+1));

  41.     i = delete_sub_str(input, sub_str, output);
  42.     
  43.     printf("result = %s, count = %d", output, i);
  44.     while(1);
  45.     free(output);
  46. }



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~方法2~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<string.h>

  3. int delete_sub_str(const char *str, const char *sub_str, char **result_str)
  4. {
  5.     char *pos;
  6.     int len, count, len1;
  7.     int i;
  8.     char *p;

  9.     len1 = strlen(str);

  10.     p = (char *)malloc(sizeof(char) * (len1+1));

  11.     strcpy(p, str);
  12. //    while(*str != '\0')
  13. //        *p++ = *str++;
  14.     count = 0;
  15.     
  16.     len =strlen(sub_str);
  17.     
  18.     while((pos = strstr(p, sub_str)) != NULL)
  19.     {
  20.         count ++;
  21.         i = pos - p;
  22.         
  23.         p[i] = '\0';
  24.         strcat(p, pos+len);        
  25.     }
  26.         
  27.     *result_str = p;
  28.     printf("%s\n",*result_str);

  29.     return count;
  30. }

  31. int main(int argc, char** argv)
  32. {
  33.     const char *input = "hello_world_hello";

  34.     char *output = NULL;
  35.     char *sub_str = "llo";
  36.     int i = 0;
  37.     
  38. //    int len1 = strlen(input);

  39. //    output = (char *)malloc(sizeof(char) * (len1+1));

  40.     i = delete_sub_str(input, sub_str, &output);
  41.     
  42.     printf("result = %s, count = %d", output, i);
  43.     while(1);
  44.     free(output);
  45. }


阅读(870) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~