strtok()切割字符串函数


#include <iostream>
#include <string.h>
using namespace std;
char *my_strtok(char *dist,const char *src)
{
    static char *result;
    //此处使用静态变量保存dist,
    //为了满足库函数strtok(NULL," ")的实现。
    char map[32];
    const char *p = src;
    memset(map,0,sizeof(map));
    while (*p)
    {
        map[*p >> 3] |= (0x1 << (*p & 0x7));
        p++;
    }
    //ASCII中总共仅仅有256个字符。所以我们将src映射到32个char数组中,
    //然后将较低的7位取出作为该数组中8个位中的一位,而且将该位置1。
    //表示这个位置存在。在这里要保证唯一确定的一一相应的关系,刚好
    //32个char数组就能够满足我们的需求了。
    char *q;
    if (dist)
        q = dist;
    else
        q = result;
    //假设从外部传进来的第一个參数是NULL。那么我们依据上一个參数
    //的结束位置開始。这里要用到保存的result变量。

while ((map[*q >> 3] & (1 << (*q & 0x7))) && *q)q++; //除去前面的多余切割符号。

dist = q; for (; *dist; dist++) { if (map[*dist >> 3] & (0x1 << (*dist & 0x7))) { *dist=''; dist++; break; } //第一次出现制定切割符的地放,然后停止break。 } result = dist; //此处result的作用就来了,保存上一次操作的最后一个位置的下一个位置。 //也就是说,假设外面传进来NULL作为第一个參数的话,我们就会从result開始。

return q; } int main() { char s[] = "abc efg hlk"; cout << my_strtok(s, " ") << endl; cout<<my_strtok(NULL, " ")<<endl; cout << my_strtok(NULL, " ") << endl; return 0; }

原文地址:https://www.cnblogs.com/yfceshi/p/7282076.html