c strtok函数代码实现

char * Mystrtok(char * string, const char * control)
{
    unsigned char *str;
    const unsigned char *ctrl = (const unsigned char *)control;

    //注意这里使用了static类型,实际的strtok函数出于线程安全会使用TLS 
    static unsigned char* _TOKEN = NULL;


    static unsigned char map[32];     //赋初值
    int count;

    /* Clear control map */
    for (count = 0; count < 32; count++)
        map[count] = 0;

    /* Set bits in delimiter table */  //map为static变量,那么这个分隔符表只需要赋值一次即可
    if (NULL != string)
    {
        do {
            map[*ctrl >> 3] |= (1 << (*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 = (unsigned char *)string;
    else
        str = (unsigned char *)_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 = (char*)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 == (char*)str)
        return NULL;
    else
        return string;
}

标准库

posted @ 2021-04-13 08:04  紅人  阅读(220)  评论(0编辑  收藏  举报