在看源码的时候需要将一段并排的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. SAP S4 BP事务代码的业务伙伴和供应商,客户之间的表关系
  2. NLP中的词向量及其应用
  3. vi编辑器中的各种(整行,多行,一个单词)复制
  4. 判断C#中的字符串是否是数字,如果是转换成int类型
  5. 王爽汇编语言 实验11
  6. VS2010快捷键总结(一)
  7. 为什么MCU也要支持AI功能?
  8. python:实例化configparser模块读写配置文件
  9. Hdu 4293 DP
  10. 戴尔服务器t110做系统,戴尔服务器T110
  11. ifconfig没有ip地址_虚拟机创建后该如何获取IP地址并访问互联网实用教程
  12. IntelliJ IDEA 12.0搭建Maven Web SSH2架构项目示例(二)
  13. 线性回归及RANSAC异常值清除算法案例
  14. 宏文件下载_新星邮件速递专家2021免费版-新星邮件速递专家2021正式版下载
  15. CURA汉化 语言修改 本地化 locale
  16. 李洪超 硬件工程师_做一个优秀硬件工程师
  17. QCharts QValueAxis使用
  18. 裸眼3D LED显示屏,是未来趋势还是行业自嗨?
  19. java装逼的话_程序员装逼指南(语言篇)
  20. 改编的一个屏幕保护程序

热门文章

  1. 如何理解计算机的操作系统,什么是计算机以及如何理解
  2. 电脑连不了wifi而手机可以的解决办法
  3. python模块glob的使用
  4. php中headers,php中get_headers()函数介绍以及用法
  5. 推荐一本Vue源码阅读书籍《Vue.js技术内.幕》
  6. odoo 快速处理主从表关系 (6,0,[IDS])实例
  7. 天纵智能软件快速开发列表+统计图分析插件
  8. 基于 Cookie 的 SSO 中间件 kisso
  9. android二维码开源项目zxing编译 命令行编译
  10. 二十多岁该做些什么,将来才不会后悔?