免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: huasd1109
打印 上一主题 下一主题

[C] C语言实现split函数 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2008-06-12 18:34 |只看该作者
原帖由 saite 于 2008-6-12 18:27 发表
.strtok里面用到了static变量,多线程跑可能会有问题的

知道多线程而不知道 _r,该说你是熟悉多线程还是不熟悉多线程呢?

论坛徽章:
0
12 [报告]
发表于 2008-06-18 21:33 |只看该作者
char **str_split(const char *str, const char ch)
{
        char *s, *ss, *head;
        char **split_ls, **p;
        int i, len;
        len = strlen(str)+1;
        s = (char *)malloc(len);
        split_ls = (char **)malloc(len);
        strcpy(s, str);
        head = s;
        ss = s;
        p = split_ls;
        while(*s){
                if(*s == ch){
                        *s = '\0';
                        len = strlen(head)+1;
                        *p = (char *)malloc(len);
                        strcpy(*p,head);
                        p++;
                        head = ++s;
                }
                else s++;
        }
        len = strlen(head)+1;
        *p = (char *)malloc(len);
        strcpy(*p,head);
        p++;
        *p = NULL;
        free(ss);
        return split_ls;
}


void test_str_split()
{
        char **p = str_split("hello,world,saite", ',');
        char **_p = p;
        while(*p){
                printf("%s\n",*p);
                free(*p);
                p++;
        }
        free(_p);
}

malloc失败需要再处理一下..
to ls, strtok的_r是什么?

论坛徽章:
0
13 [报告]
发表于 2008-07-09 17:27 |只看该作者
原帖由 saite 于 2008-6-18 21:33 发表
char **str_split(const char *str, const char ch)
{
        char *s, *ss, *head;
        char **split_ls, **p;
        int i, len;
        len = strlen(str)+1;
        s = (char *)malloc(len);
        split_ls = (char **)malloc(len ...


你的split_ls = (char **)malloc(len);这条语句有问题,
应该是split_ls = (char **)malloc(len*sizeof (char *));
要不然的话,在某些情况下会出错;

论坛徽章:
0
14 [报告]
发表于 2008-07-09 20:52 |只看该作者
给你设计一个接口,足够99.99%的情况使用。另外0.01%就特事特办吧。

//return the count of sub strings
int my_fast_split(char* input, char* out_buf, int out_unit_count, int out_unit_len, char splitter);

调用:
char buf[100][100];
int count = my_fast_split(input_msg, &buf[0][0], 100, 100, ';');

[ 本帖最后由 wwwsq 于 2008-7-9 22:41 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2008-07-09 21:39 |只看该作者

回复 #13 融化的冰山 的帖子

.指针就是int型的..

论坛徽章:
0
16 [报告]
发表于 2008-07-10 09:07 |只看该作者
用脚本语言做文本处理吧,比如Lua,跟C嵌入得蛮好的

论坛徽章:
0
17 [报告]
发表于 2008-07-10 09:13 |只看该作者
用glib库应该能实现这个要求,先占个位,有时间补上代码!


  1. /*
  2. * split.c
  3. * 利用glib库实现的 split 函数功能
  4. * veking
  5. * 2008-07-11
  6. */

  7. #include <stdio.h>
  8. #include <glib.h>

  9. GPtrArray *split(char *s, const char *t, size_t n);

  10. int main(void)
  11. {
  12.   int i;
  13.   char *str = "one,two,three,monday,sunday";
  14.   GPtrArray *arr = g_ptr_array_new();

  15.   arr = split(str, ",", 32);

  16.   for(i = 0; i < arr->len; i++){
  17.     fprintf(stdout, "item[%d]: %s\n", i, g_ptr_array_index(arr, i));
  18.   }

  19.   g_ptr_array_free(arr, TRUE);

  20.   return 0;
  21. }

  22. /*
  23. * split
  24. * s 是要进行分割的字符串,分割后值被改变,如果不想改变其值,请自行修改
  25. * t 是字符串的分隔符号
  26. * n 是数组元素的缓冲区大小
  27. */
  28. GPtrArray *split(char *s, const char *t, size_t n)
  29. {
  30.   GPtrArray *a = g_ptr_array_new();
  31.   char *p = NULL;
  32.   char *buf = NULL;

  33.   buf = (char *)malloc(n);
  34.   if(!buf){
  35.     fprintf(stderr, "malloc error!\n");
  36.     exit(1);
  37.   }

  38.   while((p = strpbrk(s, t))){
  39.     strncpy(buf, s, p - s);
  40.     g_ptr_array_add(a, strdup(buf));
  41.     s += p - s + strlen(t);
  42.     memset(buf, 0, sizeof(buf));
  43.   }
  44.   if(s)
  45.     g_ptr_array_add(a, strdup(s));

  46.   free(buf);

  47.   return a;
  48. }
复制代码


编译命令:
gcc `pkg-config --cflags --libs glib-2.0` -o split split.c

执行结果:
item[0]: one
item[1]: two
item[2]: three
item[3]: monday
item[4]: sunday

[ 本帖最后由 veking 于 2008-7-11 22:54 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2008-07-10 10:37 |只看该作者
原帖由 saite 于 2008-7-9 21:39 发表
.指针就是int型的..


是我没说清楚,char *占4个字节,当分割出来的字符串数量大于strlen(p)/4时,
分配的指针就不够用了。

例如
char **p = str_split("h,e,l,l,o,w,o,r,l,d,s,a,i,t,e", ',');

论坛徽章:
0
19 [报告]
发表于 2008-07-11 21:48 |只看该作者

回复 #18 融化的冰山 的帖子

.明白。。受教了

论坛徽章:
0
20 [报告]
发表于 2008-07-11 22:23 |只看该作者
原帖由 saite 于 2008-6-18 21:33 发表
len = strlen(head)+1;
        *p = (char *)malloc(len);
        strcpy(*p,head);


*p = strdup(head);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP