strtok的函数原型:
#include <string.h>char *strtok(char *str, const char *delim);
函数用法:当str不为NULL时,函数依据delim字符串中的字符作为分隔符,将其str字符串切分,并返回第一个子字符串。然后,当每次以NULL调用strtok函数时,会返回下一个子字符串。一直到strtok返回NULL为止。
比如下面这样:
int main ()
{
char str[] ="This,,,a-s,ample string.";
char * pch;
printf("%s\n", str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
//printf("%s\n", str);
return 0;
}
实现思路:借助于局部静态变量来保存切割一次之后的剩余字符串。注意在分割出的字符串中无论前后都不能出现分隔符。通过对string.h中的strtok的函数观察发现,在调用strtok之后,原字符串确实被破坏了,所以不必将子字符串拷贝到新空间去,直接在原字符串空间上加/0,即可。
实现代码:
char *strtok(char *str, const char *delim)
{
assert(delim != NULL); //分隔符字符串不能为空
static char* left = NULL; //局部静态变量:保存剩余的字符串
if(str == NULL) //如果str为空,则使用剩余的字符串
str = left;
if(str == NULL)
return NULL;
const char *p;
bool flag;
while(*str != 0) //去除起始部分的分隔符
{
p = delim;
flag = false;
while(*p != 0) //判断当前字符是否属于分隔符
{
if(*p++ == *str)
{
flag = true;
break;
}
}
if(!flag)
break;
++str;
}
char *s = str; //str保留住字符串起始指针
while(*s != 0) //当遇到第一个分隔符是停止
{
p = delim;
flag = false;
while(*p != 0) //判断当前字符是否属于分隔符
{
if(*p++ == *s)
{
flag = true;
*s = 0;
break;
}
}
++s;
if(flag)
{
left = s;
return str;
}
}
left = NULL; //到字符串末尾也没遇到分隔符,没有剩余串了。
return str;
}