strtok和strtok_r

本文介绍了strtok和strtok_r两个字符串分割函数的用法。strtok在处理字符串时会对原字符串进行修改,不适用于多线程环境。strtok_r作为线程安全的版本,通过用户提供的保存指针避免了全局变量冲突。

最新项目开发上需要用到字符串分割识别功能,了解到strtok用法,简单总结下。

strtok
函数原型char* strtok(char *str,const char *delimiters);

来分析一下这个分割字符串函数,这个函数是在传入的字符数组里进行调整,它并没有生成新的字符数组。
第一个参数可以是字符数组或者NULL,第一次切割传要切割的字符,第二次要在原来字符数组上继续切割就传NULL;

第二个参数传入的是切割符,这个参数看起来简单其实是比第一个还复杂,它传入的是一个字符串,而不是一个字符。

使用strtok注意事项
1)对同一个字符数组切割,第一个形参使用时候记得非第一次次分割,传的是NULL。
2)还有就是它会对源字符串修改,如果源字符串还要继续使用的话,先利用strcpy一个临时字符数组,在实现字符分割。
3)压入第一个形参是传字符数组,不能传const char *类型,这样是字符串常量不能进行修改。
4)我们传入的第二个形参是字符串,不是字符,意味着是“ ” ,是双引号,不是单引号‘ ’哪怕只有一个字符
5)在使用线程中,使用strtok是不安全的,因为他们共享全局变量,strtok的内部静态指针会被所有线程共享,所以才引出了我们strtok_r这个函数,我们下面会去讲解下。

函数strtok_r是函数strtok的可重入版本,也即线程安全版本。在函数strtok中剩余字符串是存储在一个静态变量中,因此,多线程在使用该静态变量时引起冲突;而strtok_r则使用用户传入的指针为每个用户saveptr重新申请变量,因而可以保证线程安全。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char pSrc[] = "this is lincheng i am from hangzhou china";
	char* pToken = NULL;
	char* pSave = NULL;
	char* pDelimiter = " ";
	pT
### strtok_r strtok_s 函数的使用方法 #### strtok_r 函数 `strtok_r` 是 `strtok` 函数的可重入版本,用于分割字符串。其函数原型为: ```c char *strtok_r(char *str, const char *delim, char **saveptr); ``` 其中,`str` 是要分解的字符串,在首次调用时传入要分割的字符串,后续调用传入 `NULL`;`delim` 是分隔符字符串;`saveptr` 是一个指向 `char` 的指针变量,用来在 `strtok_r` 内部保存切分时的上下文,以应对连续调用分解相同源字符串[^1]。 示例代码如下: ```c #include <stdio.h> #include <string.h> int main() { char str[] = "apple,banana,cherry"; char *token; char *saveptr; // 首次调用 token = strtok_r(str, ",", &saveptr); while (token != NULL) { printf("%s\n", token); // 后续调用 token = strtok_r(NULL, ",", &saveptr); } return 0; } ``` #### strtok_s 函数 `strtok_s` 是 `strtok` 的线程安全版本,函数原型为: ```c char *strtok_s(char *str, const char *delim, char **ptr); ``` `str` 为要分解的字符串,首次调用传入要分割的字符串,后续调用传入 `NULL`;`delim` 是分隔符字符串;`ptr` 用于存放剩余字符的地址,方便下一次使用[^3]。 示例代码如下: ```c #include <stdio.h> #include <string.h> int main() { char str[] = "apple,banana,cherry"; char *token; char *next_token; // 初始调用 token = strtok_s(str, ",", &next_token); while (token != NULL) { printf("%s\n", token); // 后续调用 token = strtok_s(NULL, ",", &next_token); } return 0; } ``` ### strtok_r strtok_s 函数的区别 - **平台适用性**:`strtok_r` 主要用于 POSIX 系统,而 `strtok_s` 是 Microsoft 实现的,主要用于 Windows 平台。 - **功能本质**:二者本质上都是为了解决 `strtok` 线程不安全的问题,`strtok_r` 通过用户传入的 `saveptr` 保存剩余字符串,`strtok_s` 则通过 `ptr` 保存剩余字符地址,都保证了线程安全。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值