函数原型
char * strtok ( char * str, const char * delimiters );
功能
多次调用这个函数将str以delimiters分割点分割成连续的字符串
特点
第一次调用函数期望一个C字符串作为str参数。
以后的调用期望一个null指针做为str参数,并使用上一个token最后位置的后一个位置做为起始地址。注意
- 为了确定一个token的开始和结尾,函数从开始位置寻找第一个不在delimiters中的字符,这个字符会成为token的第一个字符。然后再寻找第一个在delimiters中的字符,那个字符成为token的end。如果null终止符被发现,函数也会结束。
- token的end会自动被null字符替换,token的开始位置作为返回值返回。
- 一旦发现str中的null字符串,接下来所有的对这个函数的调用(使用null做为第一个参数)都会返回 null指针。
- 最后一个分割的token的指针会被保留在函数内部,在下一次调用中会被使用。
函数源码
char * strtok(char *s, const char *delim)
{
static char *lasts;
return strtok_r(s, delim, &lasts);
}
strtok_r(char *s1, const char *s2, char **lasts)
{
char *ret;
if (s1 == NULL) //第一次调用之后的调用,都使用前一次记录的位置
s1 = *lasts;
while(*s1 && strchr(s2, *s1)) //找到第一个没出现在delimiter中的字符
++s1;
if(*s1 == '\0') //如果遇到NULL字符 那么之后的调用(str==NULL)都会返回NULL
return NULL;
ret = s1; //s1就是token的第一个位置
while(*s1 && !strchr(s2, *s1)) //找到第一个出现在delimiter中的字符
++s1;
if(*s1) //token中的end自动被替换成null
*s1++ = '\0';
*lasts = s1; //记录下一次开始的位置
return ret;
}
例子
/* strtok example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
Splitting string "- This, a sample string." into tokens:
This
a
sample
string