一:基本概念
函数原型:
#include<string.h>
char *strtok(char *str,const char *delim);
/*str:为需要被切割的字符串的首地址;
delim:为切割字符串,字符串中的每个字符都可以当做分隔符;*/
函数功能:切割字符串。
返回值:当str中的字符查找到末尾时返回NULL;当在字符串中找不到分隔符时返回当前strtok的字符串的指针。
注意:第一次调用strtok()时,str传入需要被切割的字符串;在后面的调用时给str传入NULL。
举例:
运行结果:
二:扩展两个函数:
(1)、
#include<string.h>
char *strchr(char *str,char character);
/*
参数含义:str:字符串指针;character:待查找字符。
功能:从字符串str中找到第一次出现charcter的位置。
返回值:如果找到了,返回第一次找到的character位置的指针;如果没找到,返回NULL。
*/
(2)、
#include<string.h>
size_t strspn(const char *str,const char *accept);
/*
功能:计算str中连续有几个字符都属于字符串accept.
返回值:返回字符串str开头连续包含字符串accept内的字符个数。若字符串str开头连续n个字符都属于accept,则返回n;若字符串str第一个字符不属于accept,则返回0;
*/
函数使用及运行结果:
三:自己实现一个字符串切割函数:
运行结果:
四:可重入和不可重入函数
(1)、可重入函数:可被中断的函数。意味着除了使用自己栈上的变量以外不依赖于任何环境,可以允许有该函数的多个副本进行。
(2):不可重入函数:是不安全函数,这类函数不能运行在多任务下。一般不可重入函数的标志:函数体内使用了全局变量,静态的数据结构;调用了malloc()或者free()函数;调用了标准I/O函数。一些
由不可重入函数的定义可以对比前面我们自己实现的strtok()函数,在strtok()实现过程中我们使用了全局变量或者静态局部变量。所以我们平时使用的strtok()切割函数是不可重入函数,如果在进行多任务时会出现不可预料的的结果,因此我们建议在多任务环境下要使用它们的安全版本或者利用锁或者信号量进行控制。下面列举一些在多线程中不可重入的函数。
五:在Linux平台上,strtok_r()是strtok()函数的线程安全版。
函数原型:
#include<stdio.h>
char *strtok_r(char *str,const char *delim,char **saveptr);
/*
char **saveptr参数是一个指向char*的指针变量,用于在strtok_r内部保存切分的上下文,以对应连续调用分解相同源字符串。
*/
在多线程下对比两个函数:
运行结果: