注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

逍遥子 曰:

得失失得 何必患得患失 舍得得舍 不妨不舍不得

 
 
 

日志

 
 

[原]字符串分割函数strtok_r的用法  

2013-10-30 15:49:29|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


一、函数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!

  评论这张
 
阅读(3672)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017