免费注册 查看新帖 |

Chinaunix

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

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

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

论坛徽章:
0
22 [报告]
发表于 2008-07-11 23:08 |只看该作者
原帖由 融化的冰山 于 2008-7-9 17:27 发表


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


那也不对

char **str_split(const char *str, const char ch)
对于 str_split( "aaaaa", 'a' );

saite的代码起码需要 malloc(    (len+2)     *sizeof (char *));

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

  GPtrArray *arr = g_ptr_array_new();

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


确信这样写不会有内存泄露?

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

g_ptr_array_free(arr, TRUE);


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

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

strncpy(buf, s, p - s);


strncpy会自动补0?

论坛徽章:
0
26 [报告]
发表于 2008-07-11 23:32 |只看该作者
看了这些代码,得把人气死

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

memset(buf, 0, sizeof(buf));


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

论坛徽章:
0
28 [报告]
发表于 2008-07-11 23:59 |只看该作者
用上glib库这个函数就失去了它的意义了:
1.split是基本功能,不应该用到glib库,应该是glib库用split才对
2.为了一个小小的功能,引一个非基本库进来,不值
3.很多人机器上没glib库
4.用了glib库意味着windows上不能跑

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

while((p = strpbrk(s, t))){
。。。。。
s += p - s + strlen(t);


再来吹毛求疵一把,
这里写strlen(t), 暗示t是一个字符串了,不一定是长度为1,
那么
   split( "ab-cd-=ef-g-hi", "-=", 32 )
能得到期望的效果吗?

另外,这里使用strlen和strpbrk,两者放一起是怎么也解释不通的,
典型的梦游代码。

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


确信这样写不会有内存泄露?



--------------------------------------------------------------------------------------------------------------
/*
* split.c
* 利用glib库实现的 split 函数功能
* veking
* 2008-07-11
*/

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

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

int main(void)
{
  int i;
  char *str = "one,two,three,monday,sunday";
  GPtrArray *arr = g_ptr_array_new();

  split(arr, str, ",", 32);

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

  g_ptr_array_free(arr, TRUE);

  return 0;
}

/*
* split
* a 字符串分割后的指针数组
* s  是要进行分割的字符串,分割后值被改变,如果不想改变其值,请自行修改
* t  是字符串的分隔符号
* n 是数组元素的缓冲区大小
*/
GPtrArray *split(GPtrArray *a, char *s, const char *t, size_t n)
{
  char *p = NULL;
  char *buf = NULL;

  buf = (char *)malloc(n);
  if(!buf){
    fprintf(stderr, "malloc error!\n");
    exit(1);
  }

  while((p = strpbrk(s, t))){
    strncpy(buf, s, p - s);
    g_ptr_array_add(a, strdup(buf));
    s += p - s + strlen(t);
    memset(buf, 0, sizeof(buf));
  }
  if(s)
    g_ptr_array_add(a, strdup(s));

  free(buf);
}

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP