split实现

/*
 * strtok的替代函数
 * int
 * split(int argc, char *argv[], char *string, char *delimiter)
 * argc - 最大分割token数
 * argv - 保存token地址
 * string - 要分割成token的字符串
 * delimiter - 分界符,NULL表示默认空白字符
 * 返回值:实际的token数,这个数可能比argc大,此时argv[argc - 1]后的字符串未分割
 */
#include <stdio.h>
#include <ctype.h>
#include <memory.h>

#define BITMAP(name, counts) /
    unsigned char name[(counts + 7) / 8]
#define BITMAP_ZERO(name) /
    memset(name, 0, sizeof(name))
#define BITMAP_SET(offset, name) /
    (name)[(offset) >> 3] |= 1 << ((offset) & 7)
#define BITMAP_ISSET(offset, name) /
    ((name)[(offset) >> 3] & (1 << ((offset) & 7)))

int
split(int argc, char *argv[], char *string, unsigned char *delimiter)
{
    int rc, flags, new_flags;
    unsigned char v;
    BITMAP(map, 256);

    BITMAP_ZERO(map);
    if (delimiter)
    {
        while ((v = *delimiter++))
        {
            BITMAP_SET(v, map);
        }
    }
    else
    {
        for (rc = 0; rc < 256; ++rc)
        {
            if (isspace(rc))
            {
                BITMAP_SET(rc, map);
            }
        }
    }

    flags = 0;
    rc = 0;
    while ((v = *(unsigned char *)string))
    {
        new_flags = BITMAP_ISSET(v, map)? 0: 1;
        if (new_flags != flags)
        {
            if (flags)
            {
                if (argv && rc < argc)
                {
                    *string = '/0';
                }
            }
            else
            {
                if (argv && rc < argc)
                {
                    argv[rc] = string;
                }
                ++rc;
            }
            flags = new_flags;
        }
        ++string;
    }

    return rc;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值