c语言中strtok函数详解,手把手教你自主实现字符串切割函数,内附详细代码。
函数功能简介:
对字符串str进行切割,切割的标志为字符指针q指向的这两个字符 “# *”;。
但是在对这个函数进行调用时,只有在第一次调用时,才会将str这个字符串的首地址传递过去,后面再进行调用时,str的位置放置的都是NULL。
那他是如何实现这个功能的呢????我们可以进行调试分析一下。
第一次调用分析
该函数在对字符串进行切割时,会在目的字符串中查找是否有源字符串包含的字符,如果查找到源字符串中包含的字符,就会将这个字符改为‘\0’。,而且返回刚才传递过来的str首地址。并记录这个位置的地址。
下面我们结合内存视角来观察一下 :
刚开始创建完字符数组str后
执行第一次strtok函数后:
可以看到,原来放置字符 #的位置被修改为字符‘ \0’。其他的没有任何改变。
示意图如下:
第二次调用分析(中间调用该函数时函数的操作方式)
在进行第一次调用结束时,会记录下被修改成字符 '\0'位置的字符的地址。在第二次进行函数调用时,函数的第一个实参为NULL,这里函数会直接从上一次记录的字符的地址的后一个位置开始进行比对,看是不是还有和源字符串相同的字符,如果有,那就将它修改为 字符0,并返回刚才开始比对的字符的地址。
示意图如下:
最后一次调用分析
当字符串被切割完成后(遍历到字符串本身的\0)这个时候再次调用strtok函数,函数会直接返回一个空指针。
有了上面的这些特殊位置的函数调用分析,我们就能自己来实现一个strtok函数
自主实现strtok函数
要注意,该函数有记录功能,所以函数的定义时需要定义一下具有记录功能的变量,在函数结束时依然可以记录数据,所以这里需要定义几个静态区变量。
static int sz1 = NULL;
static int count = NULL;
static char* s1 = NULL;
static char* s2 = NULL;
总的代码实现如下
#include<stdio.h>
#include<assert.h>
#include<string.h>
//模拟实现strtok 字符串切割函数
char* my_strtok(char* str1, const char* str2)
{assert(str2);static int sz1 = NULL;static int count = NULL;static char* s1 = NULL;static char* s2 = NULL;int sz = 0;if (str1 != NULL)//说明是第一次进入。{sz1 = strlen(str1);//计算出str1中所有字符的个数s2 = str1;//记录初始地址,等下找到分割符时,将这个地址返回。sz = strlen(str2);for (*str1; *str1 != 0; str1++){ for (int i = 0; i < sz; i++){ if (i == 0){count++;}if (*str1 == *(str2 + i)){*str1 = 0;s1 = str1;//记录这一次置0的位置。return s2;} }}}else{s2 = s1+1; str1 = s2;sz = strlen(str2);for (*str1; *str1 != 0; str1++){ for (int i = 0; i < sz; i++){ if (i == 0){count++;}if (*str1 == *(str2 + i)){*str1 = 0;s1 = str1;//记录这一次置0的位置。return s2;} }}if (count > sz1){return NULL;}return s2;}}
int main()
{char arr[20] = "12@34.5";char* p = "@.";char* str = NULL;for (str = my_strtok(arr, p); str != NULL; str = my_strtok(NULL, p)){printf("%s\n", str);}return 0;
}
这里需要注意的就是当目的字符串被遍历完成之后,再次调用该函数会返回一个NULL指针。我是以计数器的方式进行实现,每当成功比对一个字符,就进行一次计数,当计数的个数比目的字符串字符个数大时,说明目的字符串被遍历完成了,此时会返回空指针。
可以看到,实现的结果是符合我们的预期的,如果有更好的算法,可以留言讨论哦!!!!
c语言中strtok函数详解,手把手教你自主实现字符串切割函数,内附详细代码。相关推荐
- 手把手教你用Python实现“坦克大战”,附详细代码!
小时候玩的"坦克大战",你还记得吗? 满满的回忆 ! 今天,我们使用Python以及强大的第三方库来实现一个简单的坦克大战游戏. 整体效果 环境依赖 python3.7 pygam ...
- java 函数fun_c语言中fun用法详解_后端开发
Java Dao层的作用_后端开发 Dao层叫数据访问层,属于一种比较底层,比较基础的操作,可以具体到对于某个表或某个实体的增删改查,其Dao层的作用是对数据库的访问进行封装,从而不涉及业务,实现解耦 ...
- c语言中funx的作用,c语言中fun用法详解
C语言中fun用法详解 fun函数是自定义的C/C++语言函数,函数功能多样.该函数名为"函数"英文function的简写,一般在示例和试题中使用,通常在主函数中被调用. C/C+ ...
- c语言关键字extern作用,C语言中extern关键字详解
<C语言中extern关键字详解>由会员分享,可在线阅读,更多相关<C语言中extern关键字详解(5页珍藏版)>请在人人文库网上搜索. 1.C 语言中 extern 关键字详 ...
- C语言中const用法详解
C语言中const用法详解 const修饰普通变量 const作用在于定义一个常量,比如const int a = 10,代表a的值不能被直接修改了,是一个常量,但仍可以通过指针的方式间接修改,如下图 ...
- (转载)完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三
手把手叫你玩转网络编程系列之三 完成端口(Completion Port)详解 ----- By PiggyXP(小猪) 前 言 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了, ...
- pythonpandas函数详解_对pandas中Series的map函数详解
Series的map方法可以接受一个函数或含有映射关系的字典型对象. 使用map是一种实现元素级转换以及其他数据清理工作的便捷方式. (DataFrame中对应的是applymap()函数,当然Dat ...
- C语言中typedf函数的用法,C语言中typedef用法详解
在C语言中,经常有如下的用法: typedef struct tag{ ...} MyType, *MyPtr; 一旦通过如上定以后,就可以用MyType来定义struct tag结构了. 以 ...
- C语言中get_put函数详解,C语言第五课之getchar函数和putchar函数
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 getchar函数也就是键盘输入函数,这个函数和scanf函数不一样!getchar函数没有scanf函数灵活.下面就给大家介绍下getchar函数的介绍 ...
最新文章
- 手机qq协议做的第三方qq软件
- 机器学习(MACHINE LEARNING)MATLAB求解状态转移矩阵
- 第三方网站实现绑定微信登陆
- 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第2章-基于速度估计的多欧拉-拉格朗日系统分布式控制
- 基于PHP的图片共享网站设计,基于php实现的web图片共享系统(论文+程序)
- linux shell 变量 管道,linux下shell,变量,管道,重定向等基础知识及技巧
- 生成某一文件夹内文件清单(批量处理)
- Python模块:time模块详解(转)
- PowerShell与系统开局(下)
- ssis 数据转换_SSIS数据类型:高级编辑器的更改与数据转换的转换
- Pycharm: 设置默认字符编码为 utf-8模版
- UOS家庭版(21.2)安装SecureCRT(scrt-9.1.1-2638.ubuntu20-64.x86_64.deb)无法运行问题
- hitool java_Hitool打开出现failed to create the java virtual machine
- linux系统用虚拟光驱装win7,怎么用虚拟光驱安装系统
- 定时执行Python程式
- 【原型图设计工具】墨刀使用说明
- Word插入带打勾图标的方框
- 锆石 Hello FPGA 笔记——part1 数字电路篇
- Cisco路由器的配置
- Zynga公布2020年第三季度财务业绩