• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言切割多层字符串(strtok_r strtok使用方法)

C语言切割多层字符串(strtok_r strtok使用方法)

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c语言中strtok,c语言strtok,c语言strtok函数,c strtok,c strtok函数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

1. strtok介绍

众所周知,strtok可以根据用户所提供的分割符(同时分隔符也可以为复数比如“,。”)
将一段字符串分割直到遇到"\0".

比如,分隔符=“,” 字符串=“Fred,John,Ann”

通过strtok 就可以把3个字符串 “Fred”      “John”       “Ann”提取出来。

上面的C代码为

如上代码,第一次执行strtok需要以目标字符串的地址为第一参数(buf=buffer),之后strtok需要以NULL为第一参数 (buf=NULL)。指针列p[],则储存了分割后的结果,p[0]="John",p[1]="John",p[2]="Ann",而buf就变 成    Fred\0John\0Ann\0。

2. strtok的弱点

让我们更改一下我们的计划:我们有一段字符串 "Fred male 25,John male 62,Anna female 16" 我们希望把这个字符串整理输入到一个struct,

要做到这个,其中一个方法就是先提取一段被“,”分割的字符串,然后再将其以“ ”(空格)分割。
比如: 截取 "Fred male 25" 然后分割成 "Fred" "male" "25"
以下我写了个小程序去表现这个过程:

这个程序输出为:
Here we have 4 strings
>Fred<
>male<
>25<
>***<
这只是一小段的数据,并不是我们需要的。但这是为什么呢? 这是因为strtok使用一个static(静态)指针来操作数据,让我来分析一下以上代码的运行过程:

红色为strtok的内置指针指向的位置,蓝色为strtok对字符串的修改

1."Fred male 25,John male 62,Anna female 16" //外循环

2."Fred male 25\0John male 62,Anna female 16" //进入内循环

3."Fred\0male 25\0John male 62,Anna female 16"

4."Fred\0male\025\0John male 62,Anna female 16"

5 "Fred\0male\025\0John male 62,Anna female 16" //内循环遇到"\0"回到外循环

6 "Fred\0male\025\0John male 62,Anna female 16" //外循环遇到"\0"运行结束。

3. 使用strtok_r

在这种情况我们应该使用strtok_r, strtok reentrant.
char *strtok_r(char *s, const char *delim, char **ptrptr);

相对strtok我们需要为strtok提供一个指针来操作,而不是像strtok使用配套的指针。
代码:

这一次的输出为:
Here we have 12 strings
>Fred<
>male<
>25<
>***<
>John<
>male<
>62<
>***<
>Anna<
>female<
>16<
>***<


让我来分析一下以上代码的运行过程:

红色为strtok_r的outer_ptr指向的位置,
紫色为strtok_r的inner_ptr指向的位置,
蓝色为strtok对字符串的修改

1. "Fred male 25,John male 62,Anna female 16" //外循环
2. "Fred male 25\0John male 62,Anna female 16"//进入内循环
3.   "Fred\0male 25\0John male 62,Anna female 16"
4   "Fred\0male\025\0John male 62,Anna female 16"
5 "Fred\0male\025\0John male 62,Anna female 16" //内循环遇到"\0"回到外循环
6   "Fred\0male\025\0John male 62\0Anna female 16"//进入内循环

原来, 该函数修改了原串.

所以,当使用char *test2 = "feng,ke,wei"作为第一个参数传入时,在位置①处, 由于test2指向的内容保存在文字常量区,该区的内容是不能修改的,所以会出现内存错误. 而char test1[] = "feng,ke,wei" 中的test1指向的内容是保存在栈区的,所以可以修改

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言切割多层字符串(strtok_r strtok使用方法)

相关文章

  • 2017-05-28C++线程优先级SetThreadPriority的使用实例
  • 2017-05-28C基础 mariadb处理的简单实例
  • 2017-05-28详解C++的JSON静态链接库JsonCpp的使用方法
  • 2017-05-28C++中的函数指针与函数对象的总结
  • 2017-05-28C 语言基础教程(我的C之旅开始了)[六]
  • 2017-05-28浅谈C语言共用体和与结构体的区别
  • 2017-05-28C++画正弦线实例代码
  • 2017-05-28C++操作MySQL大量数据插入效率低下的解决方法
  • 2017-05-28浅析C++中前置声明的应用与陷阱
  • 2017-05-28结构体类型数据作为函数参数(三种方法)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言运算符优先级列表(超详细)
    • C++读取到回车换行符问题处理
    • C语言实现socket简单通信实例
    • C++ explicit关键字的应用方法详细讲解
    • C语言中char*和char[]用法区别分析
    • C++中关于[]静态数组和new分配的动态数组的区别分析
    • 利用ace的ACE_Task等类实现线程池的方法详解
    • C# interface与delegate效能比较的深入解析
    • C语言栈的表示与实现实例详解
    • C语言中用于产生随机数的函数使用方法总结

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有