免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10201 | 回复: 13
打印 上一主题 下一主题

[C] 求教:从一字符串中删除子串 [复制链接]

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
1 [报告]
发表于 2010-11-27 10:14 |只看该作者
为什么要拆分呢,直接strstr就好了啊。

论坛徽章:
0
2 [报告]
发表于 2010-11-27 10:16 |只看该作者
这样建议把IP换算成int再去比较

论坛徽章:
0
3 [报告]
发表于 2010-11-27 10:22 |只看该作者
回复 2# ecjtubaowp


    直接strstr的话,还有“,"和“-”要处理,是不是比较麻烦啊?
我编程水平很弱

论坛徽章:
0
4 [报告]
发表于 2010-11-27 10:24 |只看该作者
本帖最后由 WHITLACK 于 2017-04-25 11:16 编辑

      .---.

论坛徽章:
0
5 [报告]
发表于 2010-11-27 10:49 |只看该作者
尽量不要用strtok

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2010-11-27 11:06 |只看该作者
strstr找
如果找的是地址,循环
  判断找到的是否属于地址段,是则继续strstr找后面是否还有匹配的

计算覆盖位置
memmove后面的字符串到指定位置

论坛徽章:
0
7 [报告]
发表于 2010-11-27 11:10 |只看该作者
回复 7# hellioncu


    用strstr会有这样的情况出现,
原串中有192.168.1.15-192.168.1.16
但我要删除的是92.168.1.1

所以同时,在查找的时候还要去判断找到的字符串的下一位是否为“,"或“-"或"\0"

同样,前一位也要做相应的判断……

各位有没有好的算法?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
8 [报告]
发表于 2010-11-27 11:13 |只看该作者
回复  hellioncu


    用strstr会有这样的情况出现,
原串中有192.168.1.15-192.168.1.16
但我要删除 ...
WHITLACK 发表于 2010-11-27 11:10



    要偷懒,源串和要找的串前后都加上逗号,这样不会匹配错了,删除的时候也简单

当然要先保证串中不会有空格

论坛徽章:
0
9 [报告]
发表于 2010-11-27 11:29 |只看该作者
这个时候高级语言的优势就出来了

论坛徽章:
0
10 [报告]
发表于 2010-11-27 12:57 |只看该作者
本帖最后由 ddgfff 于 2010-11-27 13:59 编辑

LZ,我针对你的这个需求写了个函数,呵呵~
  1. #include <stdio.h>
  2. #include <string.h>

  3. static char *del_some_str (char *str, char *del, char c)
  4. {
  5.         char *ptr = NULL, *strp = str;
  6.         int len_str = strlen(str);
  7.         int len_del = strlen(del);

  8.         while ( (ptr = strstr(strp, del)) != NULL ) {
  9.                 if (*(ptr + len_del) == '\0' && (ptr == strp || *(ptr - 1) == c))
  10.                         *(ptr - 1) = '\0';
  11.                 else if (*(ptr + len_del) == c && (ptr == strp || *(ptr - 1) == c))
  12.                         memmove (ptr, ptr + len_del + 1, (str + len_str) - ptr);
  13.                 else
  14.                         if (*(ptr + len_del) != '\0')
  15.                                 strp = ptr + len_del + 1;
  16.                         else    break;
  17.         }
  18.         return str;
  19. }

  20. int main(void)
  21. {
  22.         char str[] = "192.168.1.1,192.168.1.10,192.168.1.10-192.168.1.30,192.168.2.89,192.168.4.11,192.168.1.1";
  23.         char del[] = "192.168.1.1";
  24.         char *p;
  25.         puts(str);
  26.         p = del_some_str (str, del, ',');
  27.         puts(p);
  28.         return 0;
  29. }

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP