在看源码的时候需要将一段并排的IPs转化成为一系列的IP,将"10.0.0.1;10.0.0.2;10.0.0.3;10.0.0.4;10.0.0.5"转换成为单独的"10.0.0.1","10.0.0.2","10.0.0.3","10.0.0.4","10.0.0.5"。就是一个将一个字符串切割成为多个字符串的问题。考虑C语言中的strtok以及strtok函数。

1.strtok

原型:char *strtok(char s[], const char *delim)

功能:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。

2.strtok_r

原型:char *strtok_r(char *str, const char *delim, char **saveptr)

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

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

可重入函数:重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。如果确实需要访问全局变量(包括static),一定要注意实施互斥手段。可重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。

举个栗子:

#include<iostream>
#include<cstdlib>
#include<string.h>using namespace std;int strtok(char *pSrc)
{char *pToken = NULL;char *pDelimiter = ";";pToken = strtok(pSrc,pDelimiter);cout<<"Strtok Begin:"<<endl; while(pToken){cout<<"pToken:"<<pToken<<endl;pToken = strtok(NULL,pDelimiter);}cout<<"Strtok End!"<<endl<<endl;
}int strtok_r(char *pSrc)
{char *pToken = NULL;char *pLeft = NULL;char *pDelimiter = ";";pToken = strtok_r(pSrc,pDelimiter,&pLeft);cout<<"Strtok_r Begin:"<<endl;while(pToken){cout<<"pToken:"<<pToken<<" pLeft:"<<pLeft<<endl;pToken = strtok_r(NULL,pDelimiter,&pLeft);}cout<<"Strtok_r End!"<<endl<<endl;}int main()
{char pSrc[] = "10.0.0.1;10.0.0.2;10.0.0.3;10.0.0.4;10.0.0.5;10.0.0.6";strtok(pSrc);char pSrc1[] = "10.0.0.1;10.0.0.2;10.0.0.3;10.0.0.4;10.0.0.5;10.0.0.6";strtok_r(pSrc1);return 0;
}

运行结果:

Author:忆之独秀

Email:leaguenew@qq.com

注明出处:http://blog.csdn.net/lavorange/article/details/47134121

C语言字符串截取函数strtok和strtok_r相关推荐

  1. c语言'字符串截取函数,C语言中的字符串截取函数及应用

    /*======================================================== 对于一个五位数a1a2a3a4a5,可将其拆分为三个子数: sub1=a1a2a3 ...

  2. c语言中有裁剪字符串的函数吗,C语言中的字符串截取函数

    /*======================================================== 子数整数 源程序名 num.??? (pas,c,cpp) 可执行文件名 num. ...

  3. c语言sub函数是什么,C语言中的字符串截取函数

    C语言中的字符串截取函数及应用 /*======================================================== 子数整数 源程序名 num.??? (pas,c, ...

  4. C语言实现的字符串截取函数

    如题,实现的就是字符串截取函数,传入字符串以及要截取的位置,返回截取后的字符串,函数如下,测试可用. char *cutwords(char *page,int start,int end){char ...

  5. c语言自定义函数mid,C语言实现字符串截取函数left、mid和right

    作者:iamlaosong C语言字符串截取需要自己编程实现,不过,网络时代,自然不用自己从头写了,网上各种方法的实现代码已经多如牛毛了,这儿抄录一个感觉不错的备案. #include #includ ...

  6. 字符串分割函数strtok和strsep使用注意事项

    转载自 https://blog.csdn.net/astrotycoon/article/details/50813959 为什么写本文 最近工作中经常需要解析字符串,并且这些字符串都有一个共同的特 ...

  7. C语言字符串处理函数库

    C语言的字符串处理函数库包括复制函数.拼接函数.比较函数.搜索函数等,这些函数的声明都位于头文件<string.h>.使用这些函数时,需要使用#include<string.h> ...

  8. C语言字符串常用函数总结(持续更新)

    最近在重温C语言的一些基础知识,感觉C语言字符串操作还是比较难的,在学习的过程中总结了一些常用的字符串相关函数,包括C语言字符串输入.字符串输入.计算字符串长度.字符串赋值.字符串分割.字符串拼接.字 ...

  9. php字符串截取所有函数,PHP字符串截取函数大全

    程序一:PHP截取中文字符串方法 function msubstr($str, $start, $len) { $tmpstr = ""; $strlen = $start + $ ...

最新文章

  1. Python Open Source Project List
  2. mysql 判断是否日期类型_MySQL:日期类型
  3. nfs mysql_heatbeat-gui实现基于nfs的mysql高可用集群
  4. sql server 之函数小技巧 整数类型为空是用空字符串替代实现
  5. JS解析格式化Json插件,Json和XML互相转换插件
  6. 学习大数据看门的几本书
  7. Try Git 译文
  8. thinkphp中join用法
  9. scheduled 每月最后一天_单周、双周、每月?哪种定投方式收益最高?
  10. 更新oracle字段值
  11. Flowers Sky Wallet First school/Primary school holiday Getting up early Reading Home c
  12. 桌面计算机快捷打不开,桌面快捷方式打不开,小编教你桌面快捷方式打不开怎么解决...
  13. Android各种屏幕尺寸
  14. 大数据管理平台助力精准扶贫 “建始经验”将在全省推介
  15. 【C#基础】输入一个字符,判定它是什么类型的字符(大写字母,小写字母,数字或者其它字符)
  16. LDO与Transceiver通信芯片的组合逻辑
  17. 面向对象三大特征---继承
  18. 推荐一款“黑科技”满满的小众软件
  19. 利用Linux主机创建NFS服务
  20. pymysql.err.OperationalError: (1130, “xxx‘ is not allowed to connect to this MySQL server“)

热门文章

  1. Linux:scp 下载、上传文件
  2. html代码在线优化工具,HTML代码优化工具-WordPress编辑器增强功能插件
  3. 文件夹加密巧用“类标识符”
  4. 学校计算机网速被限制,电脑知识∣90%的人不知道,自己的网速被限制了!
  5. pycharm配置IdeaVim
  6. 闭包、闭包作用及缺点
  7. 2021计算机自考本科,《电脑印刷设计》2021.4自考本科考卷
  8. 公司代码规范模板参考
  9. 不仅仅是安全设置?打开支付宝的这些服务,网友直呼太强了
  10. linux怎么查看防火墙开放的端口,linux查看防火墙状态和对外开放的端口状态