字符串分割函数strtok_r的用法


一、函数strtok_r的作用
 函数strtok_r可以将一个字符串按照指定的分割符进行分割,例如将字符串:"hello, jason, please come here",按照","分割为:
"hello"
"jason"
"please come here"

也可以按照分隔符" "分割为:
"hello,"
"jason,"
"please"

"come"

"here"

 

二、函数strtok_r说明及其注意事项
函数strtok_r是函数strtok的可重入版本,也即线程安全版本。在函数strtok中剩余字符串是存储在一个静态变量中,因此,多线程在使用该静态变量时引起冲突;而strtok_r则使用用户传入的指针为每个用户saveptr重新申请变量,因而可以保证线程安全。其定义形式为:
#include <string.h>
char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);

其中:
       char *str是被分割字符串,如上面例子中的"hello, jason, please come here",第一次调用函数strtok_r时此指针一定不能为空,连续分割同一个字符串时,第一调用之后的调用需将str设置为NULL。
       const char *delim是分隔符,也是个字符串指针,例如上面例子中的","或者" "
       char **saveptr是一个供内部使用的指针,用于保存上次分割剩下的字串。
       返回值是个指针,用于返回从被分割字符串中得到的第一个目标子串。

注意:虽然函数strtok_r可以将一个字符串进行分割,但是每次分割只能得到第一个被分割的字串,例如:按照" "分割"hello, jason, please come here"时,
       第一次调用strtok_r,参数str所指向的内存中存放被分割字符串"hello, jason, please come here"参数delim为分隔符串" "的指针,saveptr指向一个空指针变量,得到"hello,"同时saveptr中就保存了剩下的子串"jason, please come here";
       第二次调用strtok_r,参数str设置为空,参数delimsaveptr不变,得到"jason,",同时saveptr中保存了剩下的子串"please come here";
       第三次调用strtok_r(同第二次)得到"please come here"

 

三、示例代码

下面是一个测试函数,主要测试strtok_r函数的用法。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
 char pSrc[] = "this/is/jason;/i/am/from/xi'an/china";
 char* pToken = NULL;
 char* pSave = NULL;
 char* pDelimiter = "/";
 pToken = strtok_r(pSrc, pDelimiter, &pSave);
 printf("Begin:\n");
 while(pToken){
  printf("   pToken[%s]; pSave[%s]\n",pToken,pSave);
  pToken = strtok_r(NULL, pDelimiter, &pSave);
 }
 printf("End!\n");
 return 0;
}

其输出结果为:
Begin:
   pToken[this]; pSave[is/jason;/i/am/from/xi'an/china]
   pToken[is]; pSave[jason;/i/am/from/xi'an/china]
   pToken[jason;]; pSave[i/am/from/xi'an/china]
   pToken[i]; pSave[am/from/xi'an/china]
   pToken[am]; pSave[from/xi'an/china]
   pToken[from]; pSave[xi'an/china]
   pToken[xi'an]; pSave[china]
   pToken[china]; pSave[]
End!

`strtok_r`函数用于将字符串分割成一个个标记(token)。它与`strtok`函数类似,但它的一个关键区别在于`strtok_r`是线程安全的,因为它使用了一个额外的参数来保存状态信息。 下面是`strtok_r`函数的基本用法: ```c #include <string.h> char *strtok_r(char *str, const char *delim, char **saveptr); ``` - `str`:指向要被分割字符串的指针。 - `delim`:指向一个分隔符字符串的指针,该字符串包含了作为分隔符的所有字符。 - `saveptr`:指向一个字符指针的指针,该字符指针在`strtok_r`的连续调用中保存状态信息。 `strtok_r`函数的工作方式如下: 1. 它首先会找到`str`中第一个不是分隔符的字符。如果找到了,就继续执行。 2. 接着,它会扫描`str`直到遇到`delim`中的一个字符或者字符串的结尾。 3. 如果`str`中没有非分隔符字符,`strtok_r`返回NULL。 4. 如果遇到了分隔符字符,它会在该位置放置一个null字符,将字符串分割成一个token。 5. 最后,`strtok_r`将`saveptr`指向`str`中下一个字符的位置,以便下次调用时能够继续分割剩余的字符串。 需要注意的是,第一次调用时,应该将`str`设置为待分割的原始字符串,`saveptr`设置为NULL。后续的调用应将`str`设置为NULL,而`saveptr`则为之前调用返回的值。 示例代码: ```c #include <stdio.h> #include <string.h> int main() { char str[] = "example string, to split!"; char *delim = " ,"; // 分隔符为逗号和空格 char *ptr; // 初始化ptr为NULL ptr = NULL; // 第一次调用strtok_r char *token = strtok_r(str, delim, &ptr); while (token != NULL) { // 输出分割后的token printf("Token: %s\n", token); // 继续调用strtok_r获取下一个token token = strtok_r(NULL, delim, &ptr); } return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值