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; }
标准库