免费注册 查看新帖 |

Chinaunix

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

字符串分割问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-30 13:02 |只看该作者 |倒序浏览
我有一个字符串
ccc=aaaddd 0x01 www=aadfad 0x01 bbb=adfadf

有两个分隔符一个是=
一个是0x01
我希望能够按照0x01分解字符串后再按照=号分解。
分一次比较简单,但是再分第二次就有点难度。 接口方面也有点麻烦,没计了!!

[ 本帖最后由 新手上路2世 于 2006-10-30 13:09 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-10-30 14:08 |只看该作者
大家帮帮忙了!

论坛徽章:
0
3 [报告]
发表于 2006-10-30 14:16 |只看该作者
man strtok
或者
man regex

论坛徽章:
0
4 [报告]
发表于 2006-10-30 15:16 |只看该作者
如果是一般的字符也都好说 ,可是分割符是0x01 啊 怎么分割啊! 我试了好几遍,用别的就可以,用这个就不行啊! 能不能给出了例子用0x01做分割符的! 多谢帮忙了!!

论坛徽章:
0
5 [报告]
发表于 2006-10-30 15:50 |只看该作者
哪位大虾知道怎么用0x01当分割符啊!??????????

论坛徽章:
0
6 [报告]
发表于 2006-10-30 17:18 |只看该作者
自己去读字符串啊

论坛徽章:
0
7 [报告]
发表于 2006-10-30 17:27 |只看该作者
[quote]原帖由 [i]新手上路2世[/i] 于 2006-10-30 13:02 发表
我有一个字符串
ccc=aaaddd 0x01 www=aadfad 0x01 bbb=adfadf

有两个分隔符一个是=
一个是0x01
我希望能够按照0x01分解字符串后再按照=号分解。
分一次比较简单,但是再分第二次就有点难度。 接口方面也有 ... [/quote]


我再上个作上个产品中也遇到需要自己解析内存的情况,所以自己写了一个在一段内存中取一部分的函数,用法给你贴出来了,自己改改看看吧

/*------------------------------------------------------------------------------
NAME:           memchop
SRC:            libfoxsys_strings.c
INCLUDE:        sys/sys_api.h
LIBS:           libfoxsys.a libfoxsys.so
PROTOTYPE:      void *
                memchop(const void *start, int slen, const void *end, int elen,\
                                  const void *src,int dlen,int *rlen, int *ridx)
ARGUMENTS:      start: start buffer to compare with
                slen:  length of start buffer
                end:   end buffer to compare with
                elen:  length of end buffer
                src:   source buffer to search on
                dlen:  length of source buffer
                rlen:  return length of matched
                ridx:  rear index.
RETURN VALUE:   return pointer to match result if success
                return NULL on error.
                check the rlen value:
                rlen=-1: src, start,end is NULL
                rlen=-2: dlen < 1
                rlen=-3: start not found
                rlen=-4: end not found
                rlen=-4: wrong seqence of start and end
DESCRIPTION:    to intercept buffer beging with start end with end in src, then
                return its position. and store length and rindex of the match
                result to vars point by rlen, and ridx respectively.
                for example: search start with "<test>", end with "</test>" in
                "<test>hello world</test>juckdata", reslult is pointer to 'h',
                and rlen is 11(length of 'hello world'), ridx is 24 (idx of j).
BUGS:
SEE ALSO:       memstr

memchop(const void *start, int slen, const void *end, int elen,
                const void *src,int dlen,int *rlen, int *ridx)
{
        unsigned char         *ptr_s, *ptr_e;
        int                     ret;


        if ((! src) || (! start) || (! end) )
        {
                * rlen = -1;
                return NULL;
        }
        if (dlen < 1)
        {
                * rlen = -2;
                return NULL;
        }
        if ((ptr_s = (unsigned char *)memstr((char *)src, \
                        (char *)start, slen, dlen)) == NULL)
        {
                * rlen = -3;
                return NULL;
        }
        if ((ptr_e = (unsigned char *)memstr((char *)src, \
                        (char *)end,   elen, dlen)) == NULL)
        {
                * rlen = -4 ;
                return NULL;
        }

        ret = ptr_e - ptr_s ;
        ret = ret - strlen(start);

        if ((ret = (ptr_e - ptr_s -strlen(start) )) < 0)
        {
                * rlen = -5 ;
                return NULL;
        }

        if (rlen)
                *rlen  = ret ;
        if (ridx)
                *ridx = (ptr_e - ptr_s) + strlen(end) + \
                                (ptr_s - (unsigned char *) src) ;

        return ptr_s+strlen(start) ;
}

[[i] 本帖最后由 picobsd 于 2006-10-30 17:38 编辑 [/i]]

论坛徽章:
0
8 [报告]
发表于 2006-10-30 17:45 |只看该作者
谢谢上面的兄弟了!!

论坛徽章:
0
9 [报告]
发表于 2006-10-30 18:48 |只看该作者

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<unistd.h>
  5. #include<errno.h>
  6. int main()
  7. {
  8. char str[81];
  9. char *buf1[4];
  10. char *arry[7];
  11. FILE *fp;
  12. if((fp=fopen("txt","r"))==NULL)
  13.    {
  14.         fprintf(stderr,"fopen error:%s",strerror(errno));
  15.         return -1;
  16.    }
  17. while(fgets(str,80,fp))
  18.    {
  19.      /*0x01*/
  20.      str[strlen(str)-1]='\0';
  21.      buf1[0]=strtok(str,"0x01");
  22.      printf("%s\n",buf1[0]);
  23.      buf1[1]=strtok(NULL,"0x01 ");
  24.      printf("%s\n",buf1[1]);
  25.      buf1[2]=strtok(NULL,"0x01 ");
  26.      printf("%s\n",buf1[2]);

  27.      /*等号*/
  28.      arry[0]=strtok(buf1[0],"=");
  29.      printf("key1=%s\n",arry[0]);
  30.      arry[1]=strtok(NULL,"=");
  31.      printf("val2=%s\n",arry[1]);

  32.      arry[2]=strtok(buf1[1],"=");
  33.      printf("key2=%s\n",arry[2]);
  34.      arry[3]=strtok(NULL,"=");
  35.      printf("val2=%s\n",arry[3]);

  36.      arry[4]=strtok(buf1[2],"=");
  37.      printf("key3=%s\n",arry[4]);
  38.      arry[5]=strtok(NULL,"=");
  39.      printf("val3=%s\n",arry[5]);
  40.    }
  41. fclose(fp);
  42. return 0;
  43. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP