strtok函数的实现(分步详细解释配图)

article/2025/10/12 13:18:04

目录

函数大概的运行实现

1.定义一些变量 

2.开始的一些条件

3.去掉pc前面一些需要被剪掉的字符

 4.返回值ret的初始化   

5.找到下一个分隔符

 5.补\0

6.结束返回

完整代码


头文件:#include <string.h>

定义函数:char * strtok(char *s, const char *sep);

函数说明:strtok()用来将字符串分割成一个个片段。参数s 指向欲分割的字符串,参数sep 则为分割字符串,当strtok()在参数s 的字符串中发现到参数sep 的分割字符时则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s 字符串,往后的调用则将参数s 设置成NULL。每次调用成功则返回下一个分割后的字符串指针。

返回值:返回下一个分割后的字符串指针,如果已无从分割则返回NULL。


函数大概的运行实现

char arr1[] = "@@@abc*eo@*@@wbesh##";char arr2[25] = { 0 };strcpy(arr2, arr1);char* sep = "*@#";char* ret = 0;char* p = arr2;for(ret = My_strtok(p, sep); ret != NULL; ret = My_strtok(NULL, sep))printf("%s\n", ret);

执行后的结果为:

 接下来为大家分步解释

1.定义一些变量 

char* My_strtok(char* p1, const char* p2)

  p1:目标字符串(被切割)p2:sep(分割符的集合)

    assert(p2);static char* pc = NULL;char* ret = NULL;char* p3 = (char*)p2;

pc:静态变量,用来标记,作用于p1               ret:返回值                p3:拷贝p2的初始位置

assert(p2) 防止p2=NULL


2.开始的一些条件

	if (p1 == NULL && !*pc)return NULL;if (p1 != NULL)pc = p1;

第一个if判断是不是已经无从分割,无从分割时,pc指向\0,如果是就返回NULL

第二个if判断是否为第一次分割,因为第一次分割传参p1=字符串地址,第一次赋值,接下来都是p1=NULL;


3.去掉pc前面一些需要被剪掉的字符

	while (*pc && *p2)//去掉前面要被剪掉的if (*p2 == *pc){pc++;p2 = p3;}elsep2++;

列如:目标字符串@@@abc...  这里abc前面的字符都是需要跳过的

只要满足*pc==*p2 ,pc就会++指向下一个,并且p2=p3,p2重新指向第一个

如果*pc!=*p2,p2就会++指向下一个,直到p2=\0

如果p2=\0  while(*p2)条件就不满足跳出来,这个时候pc就是要被返回的第一个字符

如果pc里面没有可以被返回的字符就会一直++然后while(*pc)跳出循环

是不是很妙


 4.返回值ret的初始化   

    ret = pc;//初始化p2 = p3; 

这里很好理解


5.找到下一个分隔符

while (*pc && *pc != *p2++)//确定标记点if (!*p2){pc++;p2 = p3;}

*pc != *p2++ :这个的意思是如果满足 *pc != *p2 这个条件 之后p2++

if(!*p2)  每次当*p2=\0就执行  当p2指向\0,pc指向下一个,p2指针初始化

如果*pc == *p2 或者pc指向\0 跳出循环


5.补\0

	if (*pc)//判断是不是最后的点*pc++ = '\0';

如果pc指向的是*@#这一类的分隔符,*pc=‘\0',然后pc++指向下一个

如果pc指向\0,不操作,这样子就可以通过pc是否指向\0判断是不是无可分割,和第一步呼应


6.结束返回

	return ret;

完整代码

char* My_strtok(char* p1, const char* p2)
{assert(p2);static char* pc = NULL;char* ret = NULL;char* p3 = (char*)p2;if (p1 == NULL && !*pc)return NULL;if (p1 != NULL)pc = p1;while (*pc && *p2)//去掉前面要被剪掉的if (*p2 == *pc){pc++;p2 = p3;}elsep2++;ret = pc;//初始化p2 = p3;while (*pc && *pc != *p2++)//确定标记点if (!*p2){pc++;p2 = p3;}if (*pc)//判断是不是最后的点*pc++ = '\0';return ret;
}


http://chatgpt.dhexx.cn/article/18pZyuSh.shtml

相关文章

strtok函数及其模拟

1.strtok函数的参数和返回值 参数&#xff1a;第一个参数指定一个字符串&#xff0c;它包含了0个或者多个由del字符串中一个或者多个分隔符分割的标 记。 第二个参数del参数是个字符串&#xff0c;定义了用作分隔符的字符集合。 返回值&#xff1a; 如果找到分割符号&#xff…

详解 strtok 函数以及模拟实现

目录 一、strtok 函数的介绍 二、strtok 函数的模拟实现 一、strtok 函数的介绍 函数原型&#xff1a; char* strtok(char* str, const char* delimiters); delimiter n.[计]分隔符&#xff0c;定界符&#xff08;a character that marks the beginning or end of a unit o…

strtok(), strtok_s() 字符串分割函数

strtok(), strtok_s() 字符串分割函数 //strtok()函数原型/*_Check_return_ _CRT_INSECURE_DEPRECATE(strtok_s) _CRTIMP char * __cdecl strtok(_Inout_opt_z_ char * _Str, _In_z_ const char * _Delim);*/ 当strtok()在参数_Str的字符串中发现参数_Delim中包涵的分割字符时…

strtok函数与函数用法实例

一&#xff1a;函数简介&#xff1a; 使用strtok函数需要索引头文件#include<string.h>,strtok函数通常用于分割以及重组。被特殊字符间隔的字符串。 strtok的函数原型为char *strtok(char *str, char *sep&#xff09;strtok()在参数str的字符串中发现参数sep中包含的…

c语言中strtok函数详解,手把手教你自主实现字符串切割函数,内附详细代码。

函数功能简介&#xff1a; 对字符串str进行切割&#xff0c;切割的标志为字符指针q指向的这两个字符 “# *”&#xff1b;。 但是在对这个函数进行调用时&#xff0c;只有在第一次调用时&#xff0c;才会将str这个字符串的首地址传递过去&#xff0c;后面再进行调用时&#xf…

strtok函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用)

strtok()函数用于&#xff1a; 将字符串拆分为标记 函数介绍 函数声明&#xff1a;char * strtok ( char * str, const char * delimiters ); 头 文 件&#xff1a;#include <string.h> 返 回 值&#xff1a; 返回值为char * 类型 。如果找到标记&#xff0c;则为指向…

C/C++字符串函数strtok()详解

函数作用 找到与delimiter相同的地方&#xff0c;将其截断&#xff0c;并返回str 函数理解 第一个参数str是待切割字符串 第二个参数delimiter是分隔符字符串 返回值为char * &#xff0c;一般默认返回str的地址 strtok() 的原理是将查找到与delimiter相同的部分字符串的…

strtok()函数的使用以及注意事项

一、函数的简介 函数原型&#xff1a;char *strtok(char *s, char *delim) 功能&#xff1a;作用于字符串s&#xff0c;以delim中的字符为分界符&#xff0c;将s切分成一个个子串&#xff1b;如果&#xff0c;s为空值NULL&#xff0c;则函数保存的指针SAVE_PTR在下一次调用中将…

strtok()函数

strtok() 将字符串拆分成tokens&#xff0c;tokens是被分隔符中的任何字符分隔的连续字符序列 char* strtok( char* str,const char* sep ); sep参数是个字符串&#xff0c;定义了用作分隔符的字符集合第一个参数指定一个字符串&#xff0c;它包含了0个或者多个由sep字符串中一…

strtok函数的基本使用

strtok函数的基本使用 一、功能及解释&#xff1a;strtok函数的简单运行strtok函数的基本使用 strtok的函数原型&#xff1a; char* strtok (char* str, const char* sep) 一、功能及解释&#xff1a; 1.包含在string.h头文件中 2.sep是个字符串&#xff0c;定义了用作分隔符…

关于函数strtok和strtok_r的使用要点和实现原理(一)

strtok函数的使用是一个老生常谈的问题了。该函数的作用很大&#xff0c;争议也很大。以下的表述可能与一些资料有区别或者说与你原来的认识有差异&#xff0c;因此&#xff0c;我尽量以实验为证。交代一下实验环境是必要的&#xff0c;winxpvc6.0&#xff0c;一个极端平民化的…

strtok函数

头文件 string.h 函数声明 char * strtok &#xff08;char * str&#xff0c;const * sep&#xff09; 返回值 分隔符之前字符串的首地址 用法 sep的参数是个字符串&#xff0c;定义了用作分隔符的字符集合str指定一个字符串&#xff0c;它包含了一个或多个sep中分隔符分割的…

C语言strtok()函数详解

函数原型 char *strtok(char *str, char const *sep);第一次调用strtok函数时,这个函数将忽略间距分隔符并返回指向在str字符串找到的第一个符号的指针,丢掉分隔符sep,添加NULL字符结尾&#xff08;可以理解为用NULL替换了sep&#xff09;. 通过调用一系列的strtok函数,更多的…

数据库面试题——内连接与外连接、左连接与右连接的区别

内连接与外连接的区别: 1、连接结果不同 内连接的连接结果仅包含符合连接条件的行&#xff0c;参与连接的两个表都必须符合连接条件&#xff1b;而外连接的连接结果不仅包含了符合连接条件的行&#xff0c;同时还包括不符合自身条件的行&#xff0c;其中还包括左外连接、右外连…

sql中内连接和外连接的区别

对于两张表&#xff0c;外连接和内连接的区别在于&#xff1a; 内连接&#xff1a;只显示两表id匹配的左外连接&#xff1a;显示join左边的表的所有数据&#xff08;不管两表是否匹配&#xff09;&#xff0c;对于不匹配的部分都用NULL显示右外连接&#xff1a;与左外连接相反…

左连接 ,右连接,内连接和全外连接的4者区别

基本定义&#xff1a; left join &#xff08;左连接&#xff09;&#xff1a;返回包括左表中的所有记录和右表中连接字段相等的记录。 right join &#xff08;右连接&#xff09;&#xff1a;返回包括右表中的所有记录和左表中连接字段相等的记录。 inner join &#xff08;等…

数据库中的内连接、自然连接和外连接的区别

数据中的连接join分为内连接、自然连接、外连接&#xff0c;外连接又分为左外连接、右外连接、全外连接 当然&#xff0c;这些分类都是在连接的基础上&#xff0c;是从两个表中记录的笛卡尔积中选取满足连接的记录。笛卡尔积简单的说就是一个表里的记录要分别和另外一个表的记…

交叉连接、内连接和外连接的区别及使用方式

一、交叉连接、内连接、外连接的区别 交叉连接又叫’笛卡尔积’&#xff0c;它是指不使用任何条件&#xff0c;直接将一个表的所有记录和另一个表中的所有记录一一匹配。内连接 则是只有条件的交叉连接&#xff0c;根据某个条件筛选出符合条件的记录&#xff0c;不符合条件的记…

内连接与外连接区别

内连接&#xff1a;指连接结果仅包含符合连接条件的行&#xff0c;参与连接的两个表都应该符合连接条件。 外连接&#xff1a;连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。 左外连接&#xff1a;左边表数据行全部保留…

mysql 内连接、自然连接、外连接的区别

数据库中的内连接、自然连接、外连接 注意&#xff1a;mysql不支持全外连接&#xff0c;using和on的区别在于需要连接的两个表的属性名相同的时候使用using和on效果一样&#xff0c;而属性名不同的时候必须使用on 数据库中的连接join分为内连接、自然连接、外连接&#xff0c…