strtok实现

来源:互联网 发布:合力叉车 知乎 编辑:程序博客网 时间:2024/06/05 19:56
//建立control的hash表,然后通过map[*str >> 3] & (1 << (*str & 7))寻找位置并比较char * __cdecl strtok (        char * string,        const char * control        ){        unsigned char *str;        const unsigned char *ctrl = control;        unsigned char map[32];        int count;        /* Clear control map */        for (count = 0; count < 32; count++)                map[count] = 0;        /* Set bits in delimiter table */        do {//异或的目的是可能存在相同值映射到相同的数组下表里边,通过异或可以同时存多个control变量                map[*ctrl >> 3] |= (1 << (*ctrl & 7));//map[*ctrk>>3]丢弃了后三位,(*ctrl&7)保留了后三位        } while (*ctrl++);        /* Initialize str */        /* If string is NULL, set str to the saved         * pointer (i.e., continue breaking tokens out of the string         * from the last strtok call) */        if (string)                str = string;        else                str = _TOKEN;        /* Find beginning of token (skip over leading delimiters). Note that         * there is no token iff this loop sets str to point to the terminal         * null (*str == '\0') */        while ( (map[*str >> 3] & (1 << (*str & 7))) && *str )                str++;        string = str;        /* Find the end of the token. If it is not the end of the string,         * put a null there. */        for ( ; *str ; str++ )                if ( map[*str >> 3] & (1 << (*str & 7)) ) {                        *str++ = '\0';                        break;                }        /* Update nextoken (or the corresponding field in the per-thread data         * structure */        _TOKEN = str;        /* Determine if a token has been found. */        if ( string == str )                return NULL;        else                return string;}

原创粉丝点击