今天用到strtok时,总感觉怪怪的,为啥第二次调用第一个参数要用NULL, 难道是函数内部保存了当前的状态,假如这样的话,那就不能对多个串交叉调用strtok了,而且保存这个状态的不是全局变量就是static变量。 于是看了他的源码,有几个不同的版本,思想是一样的。 感觉写的挺巧妙的,深深的折服这些写库函数的牛人了。 下面是源码
版本一
char *s; /* string to search for tokens */
const char *delim; /* delimiting characters */
{
static char *lasts;
register int ch;
if (s == 0)
s = lasts;
do {
if ((ch = *s++) == '\0')
return 0;
} while (strchr(delim, ch));
--s;
lasts = s + strcspn(s, delim);
if (*lasts != 0)
*lasts++ = 0;
return s;
}
上面用到了strcspn函数,这个函数返回值是n,表示s的前n个字符都没有在delim中出现。原理是这样的,函数在一开始判断第一个参数是不是空,假如是的话,也就是第二次调用这个函数了,那么把上一次的状态last赋值给要返回的串,然后那个do实现的功能其实就是strspn函数,这个函数的返回值是n,代表 s的前n个字符全部在delim出现。也就是说do实现的是跳过s中字符属于分隔符