C库函数 ——strstr、strtok的详解
创始人
2024-06-03 14:59:15
0

💌内容专栏:【C语言】进阶部分

💌本文概括:理解C语言库函数strstr、strtok的功能。

💌本文作者:花 碟

💌发布时间:2023.3.14

目录

一、C库函数strstr()

1.函数声明

2.参数设置

3.返回值

4.函数的使用

5.模拟实现strstr函数

5.1思路分析

5.2 代码实现

 二、C库函数strtok

1.函数声明

2.规则

3.代码使用


 

一、C库函数strstr()

1.函数声明

char * strstr (const char * str1,const char * str2)

char * strstr ( const char * str1,const char * str2),函数的具体功能是在字符串 str1 中查找第一次出现字符串 str2 的位置,不包含终止符 '\0' 

2.参数设置

str1: 要被查找的字符串

str2: 在str1中要被搜索的字串

3.返回值

该函数返回在 str1中第一次出现 str2 字符串的位置,如果未找到则返回 NULL 指针

4.函数的使用

#include 
#include int main()
{char arr1[20] = "abcdefghi";char arr2[10] = "defghi";char* ret = strstr(arr1, arr2);if(ret == NULL)printf("没找到\n");elseprintf("%s\n", ret);return 0;
}

5.模拟实现strstr函数

5.1思路分析

如果说要在abbbcdef 中查找 bbc,我们首先想到的是,str1指向首字符'a',str2指针指向首字符'b',让str1与str2指针进行比较。首先str1指向的第一个字符,并不一定与str2指向的第一个字符相等,此时我们让str1向后移动,当str1指向的字符正好与str2指针指向的字符一致时,我们再让str1与str2进行两两比较遍历操作。

 在遍历的过程之中,我们会发现当str1与str2指向的位置不相等时,难道意为着没有找到子串吗?其实不是,此时我们只能说明从绿色箭头开始,我们是不能找到想要的bbc的,但并不是整个str1字符串里是没有的。

以上没有匹配成功,那怎么办呢?我们就要退回,从绿色箭头的后一个位置(让其绿色指针自增)进行继续匹配,让str2指针也回到指向首字符的位置, 再次进行遍历比较,就找到了我们此时想要的子串。

 

此时,我们还需要考虑一个问题,那就是就拿str1指针和str2指针进行操作吗?如果进行操作,我们str1和str2需要回头进行再次操作就不知道在哪个位置了。况且我们需要将 在正确找到第一次出现str2子串的首地址 后进行返回。

所以我们

创建一个s1指针变量在str1字符串中来回移动,

创建一个s2指针变量在str2字符串中来回移动,

创建一个cp指针变量用来记录正确的第一次出现str2子串的首字符位置(绿色箭头)。

 

5.2 代码实现

有了以上逻辑分析,我们实现代码起来就很容易了。将代码整理如下:

#include
#include
char* my_strstr(const char* str1, const char* str2)
{char* s1 = NULL;char* s2 = NULL;char* cp = (char* )str1;while (*cp){s2 = (char*)str2;s1 = cp;//*s1与*s2不为'\0',且两个指针指向的内容相等时,循环遍历while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}//说明str2字符串被查找完了,就返回匹配成功的首字符地址(cp)if (*s2 == '\0'){return cp;}cp++;}//没找到返回空指针return NULL;
}
int main()
{char arr1[] = "abbbcdef";char arr2[] = "bbc";char* ret = my_strstr(arr1, arr2);if (ret == NULL){printf("没找到\n");}else{printf("%s", ret);}return 0;
}

 二、C库函数strtok

1.函数声明

char * strtok ( char * str, const char * sep );

2.规则

  • sep参数是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回 NULL 指针

简单理解, 就是 用作切割字符串。参数str为想要分割的字符串,sep为分割符字符串。当strtok()在参数str的字符串中发现到参数sep的分割字符时则会将该字符改为\0 字符。在第一次调用时,strtok()必须给予参数str字符串,往后的调用则将参数str置为NULL, 在下一次调用中将作为起始位置。每次调用成功则返回被分割出片段的指针,否则返回NULL指针。

3.代码使用

#include 
#include 
int main()
{char *p = "123456789@qq.com";const char* sep = ".@";char arr[30];char *str = NULL;strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容for(str=strtok(arr, sep); str != NULL; str=strtok(NULL, sep)){printf("%s\n", str);}
}

 希望能够帮助到大家,有什么疑问可以私信我哦~

相关内容

热门资讯

中学心理剧大赛主持词 中学心理剧大赛主持词  开幕  雪和华:亲爱的各位领导、各位老师、各位同学,大家晚上好!  雪:我是...
《网购奇遇》的经典台词 《网购奇遇》的经典台词  1、生命不息,扰民不止  2、你那个培训班办的,六年就一个学员还是你媳妇 ...
婚礼男方致辞 婚礼男方致辞婚礼男方致辞尊敬的各位来宾:大家好!今天是我与××小姐结婚的大好日子!我感到十分地高兴同...
结婚单位领导致辞 结婚单位领导致辞(通用18篇)  在平时的学习、工作或生活中,要用到致辞的地方还是很多的,致辞具有能...
《天若有情》里的经典台词 《天若有情》里的经典台词  1 如果他们只是单纯的男人和女人,他们能相爱吗?  2 偷东西 是罪恶的...
《黑执事》经典台词 《黑执事》经典台词  1、一旦拒绝了信仰,就不能再踏入神的大门。  2、那是必须的,,不管何时,王只...
风雨哈佛路经典台词 风雨哈佛路经典台词  引导语:《风雨哈佛路》这部影片相信很多人都看过,亦是一部非常好看的影片,那么有...
文艺节目主持词 文艺节目主持词四篇  主持词要把握好吸引观众、导入主题、创设情境等环节以吸引观众。在一步步向前发展的...
幼儿园六一儿童节主持词 幼儿园六一儿童节主持词尊敬的各位来宾、各位朋友大家下午好!沐浴着和风丽日,我们即将迎来花团锦簇、芳香...
教师节表彰大会校长的致辞 教师节表彰大会校长的致辞范文(精选6篇)  在平平淡淡的日常中,要用到致辞的地方还是很多的,致辞讲求...
婚礼开场白主持词 婚礼开场白主持词  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。随着社会一步步向前发展...
会主持人开场白台词 会主持人开场白台词2013年会主持人开场白台词    甲:新年的钟声即将敲响,时光的车轮又留下了一道...
领导主持词 领导主持词三篇  主持词已成为各种演出活动和集会中不可或缺的一部分。在现今人们越来越重视活动氛围的社...
升学宴致辞 升学宴致辞(精选15篇)  在现实生活或工作学习中,大家一定都接触过致辞吧,致辞具有“礼仪性”或“仪...
农村白事的主持词开场白 农村白事的主持词开场白(精选10篇)  在发展不断提速的社会中,越来越多的人会用到开场白,好的开场白...
生日主持词的开场白   生日主持词开场白(一)  各位同事和寿星们,各人晚顶好!在这天高气爽、丹桂飘喷鼻的夸姣季候,咱们...
旅游文化节主持词 旅游文化节主持词  主持词的写作需要将主题贯穿于所有节目之中。现今社会在不断向前发展,主持人参与的事...
主持人串词 主持人串词  一、串词的语言特征  (串词的语言,可以说是用尽了所有的修辞手法,我们不可能去全讲,因...
浪漫婚礼司仪主持词 浪漫婚礼司仪主持词  主持词是主持人在台上表演的灵魂之所在。在现在的社会生活中,很多场合都需要主持人...
公司迎春晚会的主持词 公司迎春晚会的主持词  主持词的写作需要将主题贯穿于所有节目之中。在当今不断发展的世界,主持人在活动...