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 == '')
     */
    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++ = '';
            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;
}

标准库

从此山高路远,纵马扬鞭。愿往后旅途,三冬暖,春不寒,天黑有灯,下雨有伞。此生尽兴,不负勇往。
原文地址:https://www.cnblogs.com/feizianquan/p/14651439.html