一. 函数的使用
头文件 #include <string.h>
函数原型 char *strtok(char *s, const char *delim);
函数说明 strtok() 用来将字符串分割成一个个片段。
参数s指向欲分割的字符串,参数delim则是一个由分割字符组成的字符串,
delim中的每一个字符都起到分割作用.
当strtok() 在参数s的字符串中发现到参数delim的分割字符时会将该字符替换为\0字符.
在第一次调用时,strtok() 必须给参数s赋值,往后调用将该参数设置为NULL,
调动成功返回下一个分割后的字符串指针,若已无从分割则返回NULL
下面看一各使用的例子
/*********************************************************************************
* Copyright: (C) 2020 LuXiaoyang<920916829@qq.com>
* All rights reserved.
*
* Filename: strtok.c
* Description: This file
*
* Version: 1.0.0(31/07/20)
* Author: LuXiaoyang <920916829@qq.com>
* ChangeLog: 1, Release initial version on "31/07/20 04:50:30"
*
********************************************************************************/
int main(int argc, char *argv[])
{
char s[] = "ac;tf-gls;asd:saf-asdasd;asdasd;asd";
char delim[] = ";-:";
char *p = NULL;
printf("%s ",strtok(s,delim));
while(p = strtok(NULL,delim))
printf("%s ",p);
printf("\n");
return 0;
}
二. 源码实现
/*
* 函数名 char *my_strtok(char *str,char *delim)
* 函数功能 分割字符串
* 参数 str - 要分割的字符串 delim - 分割字符
* 返回值 成功返回分割到的第一个字符串,无从分割返回NULL
*
* */
char *strtok(char *str,const char *delim)
{
static char *next_start = NULL; //保存到静态存储区,函数返回后不会被销毁
if(str == NULL && (str = next_start) == NULL)
{
return NULL;
}
char *s = str;
const char *t = NULL;
while(*s)
{
t = delim;
while(*t)
{
if(*t == *s)
{
next_start = s + 1;
if(s == str) //第一个字符就是分隔符
{
str = next_start;
break;
}
else
{
*s = '\0';
return str;
}
}
else
{
t++;
}
}
s++;
}
return NULL;
}