strtok实现

转自:http://blog.csdn.net/mormont/article/details/53677363

#include "iostream"
#include "algorithm"
#include "map"

using namespace std;

char *strtok(char *str, const char *delim)
{
    static char *last = NULL;     // 上一次非分隔字符串字
    const char *cpdelim = delim;  // 对delim做一个备份
    bool show = false;   // 标记已出现感兴趣字符
    bool first = true;   // 第一次出现感兴趣字符

    char *tok = NULL;  // 程序的返回值

    if(str == NULL)
        str = last;  // 若str为NULL则表示该程序继续处理上一次余下的字符串

    for(; *str; str++)
    {
        delim = cpdelim;
        for(; *delim; delim++)
        {
            if(*str == *delim)
            {
                *str = '\0';  // 若找到delim中感兴趣的字符, 将该字符置为NULL
                show = true;
                break;
            }
        }

        if(*str != '\0' && first)
        {
            tok = str;  // 只记录下当前第一个非感兴趣字符的位置
            first = false;
        }

        if(*str != '\0' && !first && show)
        {
            last = str; // 第二次出现非感兴趣字符的位置
            return tok;
        }
    }

    // 执行该句表明一直未出现过感兴趣字符,
    // 或者说在出现了感兴趣的字符后, 就没再出现过非感兴趣字符
    last = str;

    return tok;
}

int main()
{
    char s[] = "ab-cd : ef;gh :i-jkl;mnop;qrs-tu: vwx-y;z";
    char *delim = "-: ";
    char *p;
    cout << strtok(s, delim) << " ";
    while(p = strtok(NULL, delim))
        cout << p << " ";
    cout << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值