一、strtok的注意事项
1、头文件为:<string.h>
2、函数声明为:char* strtok(char* str, const char* delimiters);
3、作用:将一串字符串通过分隔符分割开来
4、第一次调用需要一个字符串作为 str 的参数,后续可用空指针
5、返回的是 char* 类型的指针,指向被分割出来的这一段字符串的起始位置
二、strtok的模拟实现
#include <stdio.h>
#include <assert.h>
char* my_strchr(const char* str, int ch)
{
assert(str);//用断言判断 str 是否为空指针
while (*str && (*str != (char)ch))//从左向右查找是否有匹配的字符
{
str++;
}
if (*str == (char)ch)//如果找到了,返回此时 str 的地址
{
return (char*)str;
}
return NULL;//如果找不到,返回空指针
}
char* my_strtok(char* str, const char* deli)
{
assert(deli);//用断言判断 deli 是否为空指针
static char* state = 0;
if (str)//判断是否为空指针
{
state = str;
}
while (*state && my_strchr(deli, *state))//跳过分隔符
{
state++;
}
if ('\0' == *state)//判断 state 是否到句末
{
return NULL;
}
char* start = state;//保存起始位置
while (!my_strchr(deli, *state))//查找分隔符
{
state++;
}
//判断是否是因为遇到分隔符而跳出循环
if (*state != '\0')
{
*state++ = '\0';//将当前指针所指向的值赋为 '\0',并让 state 指向后一个值
}
return start;//返回起始位置
}
int main()
{
char str[] = "zhang__san,li__si...";
char deli[] = ",_.";
char* p = NULL;
for (p = my_strtok(str, deli); p != NULL; p = my_strtok(NULL, deli))
{
printf("%s\n", p);
}
return 0;
}
//结果为:
//zhang
//san
//li
//si
ps:若有不足,望指出
^_^感谢^_^