C语言字符串分割:strtok、strtok_r

头文件include <string.h>

一、strtok

原型

char *strtok(char s[], const char *delim);

参数与功能

分解字符串为一组字符串。s为要分解的字符串;delim为分隔符字符串。

例如:

strtok("abc,def,ghi",",")

表示将字符串以逗号进行分割,最后可以分割成为abc def ghi,尤其在点分十进制的IP中提取应用较多。

strtok作用于字符串s,以包含在delim中的字符为分界符,将s切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。

返回值

从s开头开始的一个个被分割的串。当s中的字符查找到末尾时,返回NULL。

如果查找不到delim中的字符时,返回当前strtok的字符串的指针。

所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。

说明

strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。

应用举例

#include<stdio.h>
#include<string.h>
 
int main(void)
{
    	char a[1000];
    	char aa[1000];
    	char c[] = " ";

    	printf("请输入一串字符:");
    	gets(a);
 
    	char *p = strtok(a,c);
    	printf("%s\n",p);

    	p = strtok(NULL,c);

    	while(p)
    	{
        	printf("%s\n",p);
        	p = strtok(NULL,c); 
    	}
}

运行结果:

二、strtok_r

原型

char *strtok_r(char *str, const char *delim, char **saveptr);

参数与功能

str为要分解的字符串,delim为分隔符字符串。char **saveptr参数是一个指向char *的指针变量,用来在strtok_r内部保存切分时的上下文,以应对连续调用分解相同源字符串。

strtok_r()函数用于分割字符串。strtok_r是linux平台下的strtok函数的线程安全版。windows的string.h中并不包含它,windows下的对应安全函数为strtok_s。

strtok_r函数是strtok函数的可重入版本。第一次调用strtok_r时,str参数必须指向待提取的字符串,saveptr参数的值可以忽略。连续调用时,str赋值为NULL,saveptr为上次调用后返回的值,不要修改。一系列不同的字符串可能会同时连续调用strtok_r进行提取,要为不同的调用传递不同的saveptr参数。

strtok_r实际上就是将strtok内部隐式保存的this指针,以参数的形式与函数外部进行交互。由调用者进行传递、保存甚至是修改。需要调用者在连续切分相同源字符串时,除了将str参数赋值为NULL,还要传递上次切分时保存下的saveptr。

应用举例

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

int main()
{
    	char str[]="123 adw 321 dfae";
    	char *ptr;
    	char *p;
    	printf("before strtok:  str=%s\n",str);
   	printf("begin:\n");
    	ptr = strtok_r(str, " ", &p);
    	while(ptr != NULL)
	{
        	printf("str=%s\n",str);
        	printf("ptr=%s\n",ptr);
        	ptr = strtok_r(NULL, ",", &p);
	}
	return 0;
}

运行结果:

 

参考:

https://blog.youkuaiyun.com/yishizuofei/article/details/78232946?locationNum=5&fps=1

https://baike.baidu.com/item/strtok/5522728?fr=aladdin

### 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` 保存剩余字符地址,都保证了线程安全。 ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值