免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2008-07-12 00:35 |只看该作者
原帖由 飞灰橙 于 2008-7-11 23:19 发表


这个TRUE可以free 来自 strdup的结果?



g_ptr_array_free ()

gpointer*           g_ptr_array_free                    (GPtrArray *array, gboolean free_seg);

Frees the memory allocated for the GPtrArray. If free_segment is TRUE it frees the memory block holding the elements as well. Pass FALSE if you want to free the GPtrArray wrapper but preserve the underlying array for use elsewhere.
Note

If array contents point to dynamically-allocated memory, they should be freed separately.
array :               a GPtrArray.
free_seg :      if TRUE the actual pointer array is freed as well.
Returns :       the pointer array if free_seg is FALSE, otherwise NULL. The pointer array should be freed using g_free().

论坛徽章:
0
32 [报告]
发表于 2008-07-12 00:40 |只看该作者
原帖由 飞灰橙 于 2008-7-11 23:30 发表


strncpy会自动补0?


      strncpy   

      原型:extern   char   *strncpy(char   *dest,   char   *src,   int   n);  
                  
      用法:#include   <string.h>  
      
      功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。  
      
      说明:  
                  如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。  
                  如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。  
                  src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。  
                  返回指向dest的指针。

先谢谢楼上的提醒,本人刚学习C编程时间不长,有很多地方考虑不周,望多指教!


  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(GPtrArray *a, 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.   split(arr, 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. * a 字符串分割后的指针数组
  25. * s  是要进行分割的字符串,分割后值被改变,如果不想改变其值,请自行修改
  26. * t  是字符串的分隔符号
  27. * n 是数组元素的缓冲区大小
  28. */
  29. GPtrArray *split(GPtrArray *a, char *s, const char *t, size_t n)
  30. {
  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.     buf[strlen(buf)] = '\0';       ////增加字符串结束标志
  41.     g_ptr_array_add(a, strdup(buf));
  42.     s += p - s + strlen(t);
  43.     memset(buf, 0, sizeof(buf));
  44.   }
  45.   if(s)
  46.     g_ptr_array_add(a, strdup(s));

  47.   free(buf);
  48. }
复制代码

论坛徽章:
0
33 [报告]
发表于 2008-07-12 00:42 |只看该作者
原帖由 飞灰橙 于 2008-7-11 23:32 发表
看了这些代码,得把人气死





气死的人路过.....

论坛徽章:
0
34 [报告]
发表于 2008-07-12 00:48 |只看该作者
原帖由 飞灰橙 于 2008-7-11 23:46 发表


再一个错误:
确定这里的 sizeof 是你需要的?sizeof(buf)是多少?



sizeof(buf) 在这里是 4

还是没明白这里有什么错误,请指点!

论坛徽章:
0
35 [报告]
发表于 2008-07-12 02:43 |只看该作者
原帖由 veking 于 2008-7-12 00:42 发表





气死的人路过.....


不要生气,我帮你找的每一个bug,都是有充分的理由的。

1. g_ptr_array_free, 第二个参数设成TRUE, free的东西不是你想要的。
    请翻出g_ptr_array_free 和 g_free 的代码一看便知。

2. sizeof(buf)为4
    memset ( buf, 0, 4 ), 表示什么意思?
    如果还不理解,将str中的数据颠倒一下,其他代码不要改,看看结果是否还是如你所想?
        char *str = "sunday,monday,three,two,one,";

论坛徽章:
0
36 [报告]
发表于 2008-07-12 02:45 |只看该作者
原帖由 veking 于 2008-7-12 00:40 发表

    strncpy(buf, s, p - s);
    buf[strlen(buf)] = '\0';       ////增加字符串结束标志


忍不住再指出你一个错误,这个代码,错的让人无语了。。
你还是该行吧,别写程序了:wink:

论坛徽章:
0
37 [报告]
发表于 2008-07-12 14:31 |只看该作者
原帖由 飞灰橙 于 2008-7-12 02:45 发表


忍不住再指出你一个错误,这个代码,错的让人无语了。。
你还是该行吧,别写程序了:wink:

语气太重了
范围也太大了,还可以写别的程序嘛

论坛徽章:
0
38 [报告]
发表于 2008-07-12 14:47 |只看该作者
原帖由 gawk 于 2008-7-12 14:31 发表

语气太重了
范围也太大了,还可以写别的程序嘛


sorry, veking兄弟,俺这个人总是说话叫人生气,别太介意啊

论坛徽章:
0
39 [报告]
发表于 2008-07-13 23:52 |只看该作者
原帖由 huasd1109 于 2007/6/28 19:29 发表
哪位高手帮忙用c语言写一个函数,可以实现VB script的split函数功能


楼主打劫呀! 为什么要实现VB的split?

评分

参与人数 1可用积分 -2 收起 理由
net_robber -2

查看全部评分

论坛徽章:
0
40 [报告]
发表于 2008-07-14 09:54 |只看该作者
原帖由 飞灰橙 于 2008-7-12 14:47 发表


sorry, veking兄弟,俺这个人总是说话叫人生气,别太介意啊



呵呵 我还得谢谢你给我指出这些错误呢!要不然我自己永远或者短期内很难发现到这些错误!!!

这些都是自学的,没人教啊! :(

再次感谢!!!

[ 本帖最后由 veking 于 2008-7-14 10:11 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP