strtok函数——按照指定的分隔符将字符串分割

函数原型:

char *strtok(char s[], const char *delim)
参数一:要被分割的字符串
参数二:指定的分隔符

内部实现机制

实例:

#include<stdio.h>
#include<string.h>int main()
{char buff[]="asd,sdf,dfg";char *p=NULL;p=strtok(buff,",");while(p!=NULL){ptintf("%s\n",p);p=strtok(NULL,",");}
}运行结果:
asd
sdf
dfg

strtok会从buff的首地址开始找分隔符“,”,找到后就会将“,”置换为"\0",并记住这个位置——内部会有一个静态变量指针指向此位置,以便于下一次分割。然后返回”\0“前的字符串的首地址。此时buff中字符串为:”asd\0sddf,dfg“

第二次调用strtok时,因为有静态变量指针记住了上一次分割的位置,所以参数一输入NULL占位即可,从静态变量指向的首地址”s“开始找分隔符,找到后继续将”,“置换为”\0“,返回本次分割好的字符串首地址。此时buff中字符串为:”asd\0sddf\0dfg“

...以此循环

直到最后一次调用strtok时,此时静态变量指针指向”asd\0sddf\0dfg<mark>\0</mark>“字符串末尾(标黄的\0),返回空,至此strtok函数结束分割。

strtok函数缺点:

strtok函数中有静态变量指针用来保存下一次分割的地址,那就会导致多线程中,线程都去调用strtok函数时,共用进程中的静态变量,导致运行结果不正确。

解决方法:可重入函数(线程安全函数)

strtok_s、strtok_r

//windows下的可重入函数
char *strtok_s(char *strToken,const char *strDelimit,char **context);//Linux下的可重入函数
char *strtok_r(char *str, const char *delim, char **saveptr);//参数三使用二级指针,是因为函数内部的指针变量保存下一次要分割的位置,而每一次分割结束指针所指向的位置都会发生变化,所以使用二级指针要改变指针的内容/

原理:调用strtok的可重入函数版本都是没有使用静态变量指针,线程调用自己的strtok函数,函数中使用自己的指针变量(栈上开辟了空间)去保存下一次分割的起始位置,线程间就互不干扰。

strtok函数和可重入函数strtrok_s、strtok_r的使用和注意事项相关推荐

  1. linux中可重入函数、不可重入函数

    1.结论:可重入函数必然是线程安全函数和异步信号安全函数: 线程安全函数不一定是可重入函数. 例如:strtok是既不可重入的,也不是线程安全的:加锁的strtok不是可重入的,但线程安全. 2.不可 ...

  2. Linux信号编程实践(二) 信号发送函数和可重入函数

    在早期的UNIX中信号是不可靠的,不可靠在这里指的是:信号可能丢失,一个信号发生了,但进程却可能一直不知道这一点. 现在Linux 在SIGRTMIN实时信号之前的都叫不可靠信号,这里的不可靠主要是不 ...

  3. 详解可重入函数与不可重入函数

    C/C++ 中的可重入函数与不可重入函数 引言 在编程语言发展的历程中,"函数"的概念无疑是最历史中最伟大的发明之一.简单来说,函数是完成指定功能的代码集合. 函数的基本样式: i ...

  4. C++可重入函数和不可重入函数

    C++可重入函数和不可重入函数 可重入函数是指能够被多个线程"同时"调用的函数,并且能保证函数结果正确不必担心数据错误的函数. 不可重入函数是指不能运行在多任务环境下,除非能保证互 ...

  5. c语言可重入函数和不可重入函数

    可重入函数:函数可多线程同时调用,一般是在只有局部变量的函数中 不可重入函数:函数一般情况下不可多线程同时调用,这样的函数中一般有全局.静态变量,而这样就涉及到了变量的保护问题,所以需要加入互斥锁/信 ...

  6. 总结可重入函数与不可重入函数常见的几个问题

    文章目录 什么是可重入函数与不可重入函数? 如何保证函数的可重入性? 如何将一个不可重入改写成可重入? 什么是可重入函数与不可重入函数? 可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可 ...

  7. 什么是可重入函数和不可重入函数

    可重入函数 在 实时系统的设计中,经常会出现多个任务调用同一个函数的情况.如果这个函数不幸被设计成为不可重入的函数的话,那么不同任务调用这个函数时可能修改其他任 务调用这个函数的数据,从而导致不可预料 ...

  8. Linux中的可重入函数和不可重入函数

    可重入函数 可重入函数(即可以被中断的函数)可以被一个以上的任务调用,而不担心数据破坏.可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失. 可重入函数使用的 ...

  9. 可重入函数、不可重入函数,注意事项

    1.定义可重入函数,函数内不能含有全局变量及static变量,不能使用malloc.free 2.信号捕捉函数应设计为可重入函数 3.信号处理程序可以调用的可重入函数可参阅 man 7 signal ...

最新文章

  1. 病案编码员需要计算机的什么知识,前辈分享:优秀编码员必须经历的成长过程,你到哪一级了?...
  2. java分布式应用限流实现
  3. ascll 和gbk,utf-8的简介
  4. AWS 宣布创建“真正”开源的 Elasticsearch 分支
  5. java高分面试指南:java单例模式双重检查
  6. MVC的传递数据的方法
  7. Scrapy 轻松定制网络爬虫
  8. QLabel显示图像
  9. Python操作SQLAlchemy之连表操作
  10. PHP 与 YAML
  11. bzoj4571/luogu3293 美味 (主席树+贪心)
  12. JavaScript高级程序设计
  13. 链路冗余的解决和故障的备用方案
  14. smartupload功能介绍
  15. 什么是 PHP 过滤器?为什么使用过滤器?
  16. 机器学习数学篇—基础数学知识清单
  17. 冒泡排序+快速排序+选择排序(图解)
  18. occt 几何图形库入门01
  19. [Unity3D]Unity3D游戏开发之Xml解析实现NPC对话系统
  20. android 连接蓝牙电子秤_Android实现串口通讯—连接有线电子秤

热门文章

  1. js layer的使用
  2. 开源布道,一场艰难的修行 —— 适兕与开源之道
  3. Python-- GIL 锁简述
  4. shell脚本(1)
  5. Ae:形状图层的内容添加 - 变形类
  6. python 字符串降序_python字符串排序方法
  7. higan(bsnes)游戏模拟器的编译和试玩
  8. win10域增加计算机本地用户,win10肿么从域用户登陆本地账户
  9. BUUCTF-PWN rctf_2019_babyheap(house of storm,堆SROP)
  10. 移花接木,玩转CANoe的几种扩展接口应用(六)——Matlab/Simulink模型