Chinaunix

标题: 求教:从一字符串中删除子串 [打印本页]

作者: ecjtubaowp    时间: 2010-11-27 10:14
为什么要拆分呢,直接strstr就好了啊。
作者: liexusong    时间: 2010-11-27 10:16
这样建议把IP换算成int再去比较
作者: WHITLACK    时间: 2010-11-27 10:22
回复 2# ecjtubaowp


    直接strstr的话,还有“,"和“-”要处理,是不是比较麻烦啊?
我编程水平很弱
作者: WHITLACK    时间: 2010-11-27 10:24
本帖最后由 WHITLACK 于 2017-04-25 11:16 编辑

      .---.
作者: jimmyixy    时间: 2010-11-27 10:49
尽量不要用strtok
作者: hellioncu    时间: 2010-11-27 11:06
strstr找
如果找的是地址,循环
  判断找到的是否属于地址段,是则继续strstr找后面是否还有匹配的

计算覆盖位置
memmove后面的字符串到指定位置
作者: WHITLACK    时间: 2010-11-27 11:10
回复 7# hellioncu


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

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

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

各位有没有好的算法?
作者: hellioncu    时间: 2010-11-27 11:13
回复  hellioncu


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



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

当然要先保证串中不会有空格
作者: starzhestarzhe    时间: 2010-11-27 11:29
这个时候高级语言的优势就出来了
作者: ddgfff    时间: 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. }

复制代码

作者: WHITLACK    时间: 2010-11-27 13:26
回复 11# ddgfff


    谢谢回复
不过代码还是有问题啊
你试试将要删除的子串改为92.168.1.1
作者: yulihua49    时间: 2010-11-27 15:42
有一串字符串,传进来的是一串由IP地址或地址段组成的字符串(由英文逗号隔开),现在需从中删除一个IP地址 ...
WHITLACK 发表于 2010-11-27 09:51



    正则表达式查找。
作者: system888net    时间: 2010-11-27 21:11
step 1:  以','为分割符,把各个地址(或地址段分解出来)
step 2:  以'-'为标志找出已经分离出来的各个独立数据里的地址段.
step 3:  跟各个独立的地址(或地址段)进行匹配判断决定是否删除.
作者: hujinzhi    时间: 2010-11-27 21:32
自己设计一函数来实现吧.....




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2