Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57415
  • 博文数量: 10
  • 博客积分: 520
  • 博客等级: 中士
  • 技术积分: 232
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-11 17:00
文章分类

全部博文(10)

文章存档

2010年(1)

2009年(5)

2008年(4)

我的朋友

分类: C/C++

2009-11-17 10:49:33

多学学其他的语言还是有好处的,搞了一阵C#之后,发现C#中的split很好用。虽然C也和相应的函数,但是用着有点别扭,因为第一次传入的参数和第二次传入的不一样。再一个是这个函数里面好像使用了静态变量,虽然没验证过,但是怀疑会对多线程的程序有影响,所以,不如自己实现一个比较方但。采用二级指针的方法来记录分割的位置,所以使用前一定要定义一个临时指针指向需要分割的串,否则会产生错误。

代码一:返回0表示分割完成,-1表示缓存空间过小,1表示未分割完成。

int split(char **src, char sign, char *szSaveBuf, int buf_size)
{
    char *dest = szSaveBuf;
    int cp_byte = 0;
    for(; **src != sign; (*src)++,dest++)
    {
        if(**src == '\0')
        {
            return 0;
        }
        else
        {
            *dest = **src;
            cp_byte++;
            if(cp_byte >= buf_size)
            {
                //printf("buffer size too short.\n");

                return -1;
            }
        }
    }
    (*src)++;
    return 1;
}

 

代码二,分割的动态分配内存版。

int malloc_split(char **src, char sign, char **szSaveBuf)
{
    char *begin = *src;
    int len = 0;
    int flag = 1;
    for(; **src != sign; (*src)++)
    {
        if(**src == '\0')
        {
            flag = 0;
            break;
        }
    }
    len = *src - begin;
    (*src)++;
    *szSaveBuf = (char *)malloc(len + 1);
    if(szSaveBuf == NULL)
    {
        return -8;
    }
    memset(*szSaveBuf, 0, len + 1);
    memcpy(*szSaveBuf, begin, len);
    return flag;
}


阅读(546) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~