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;}