strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串,是字符串处理函数之一,位于头文件 string.h中。

1.strstr函数的参数以及参数

两个参数分别是,要扫描的 C 字符串的首地址,和包含要匹配的字符序列的 C 字符串的首地址。。

返回值:指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回一个空指针。

tips:匹配过程不包括终止空字符,但它到此为止。

2.VS库函数的实现

char * __cdecl strstr (const char * str1,const char * str2)
{char *cp = (char *) str1;char *s1, *s2;if ( !*str2 )return((char *)str1);while (*cp){s1 = cp;s2 = (char *) str2;while ( *s2 && !(*s1-*s2) )//逐个对比,不同则跳出s1++, s2++;if (!*s2)return(cp);cp++;}return(NULL);

3.模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_ss(const char*s1, const char*s2)
{assert(s1&&s2);int t = strlen(s2);//const char * p = s1;s1存放的是一个地址把是s1赋值给变量p等价于指向相同元素的指针while (*s1){int i = 0,j=0;for (i = 0; *(s1+i)==*(s2+i); i++){j++;}if (j == t){return (char*)s1;}s1++;}return  NULL;
}
int main()
{char str1[20] = "mydarling";char str2[10] = "arli";char* ret = my_ss(str1, str2);if (ret != NULL){printf("找到了  在这开始%s",ret);}elseprintf("找不到");
}

4.KMP算法。

通常的字符串匹配算法流程如下:

从主串(目标字符串)和模式串(待匹配字符串)的第一个字符开始比较,如果相等则继续匹配下一个字符, 如果不相等则从主串的下一个字符开始匹配,直到模式串被匹配完,则匹配成功,或主串被匹配完且模式串未匹配完,则匹配失败。

而相对于以上的暴力匹配,KMP算法的改进之处在于:能够知道在匹配失败后,有多少字符是不需要进行匹配可以直接跳过的,匹配失败后,下一次匹配从什么地方开始,能够有效的减少不必要的匹配过程。其中跳过多少个字符是需要我们进行next数组的生成。

4.1两者时间复杂度的比较

我们假定n为文本串长度,m为模式串长度,因为在匹配的过程中,根据前缀表不断调整匹配的位置,可以看出匹配的过程是O(n),之前还要单独生成next数组,时间复杂度是O(m)。、

所以整个KMP算法的时间复杂度是O(n+m)

而暴力匹配的时间复杂度是O(n × m),所以KMP算法在匹配字符串中极大的提高的搜索的效率。

strstr函数及模拟相关推荐

  1. C语言函数: 字符串函数及模拟实现strtok()、strstr()、strerror()

    C语言函数: 字符串函数及模拟实现strtok().strstr().strerror() strstr()函数: 作用:字符串查找.在一串字符串中,查找另一串字符串是否存在. 形参: str2在st ...

  2. 字符串函数剖析(3)---strstr函数

    1.strstr函数的巧妙 – 查找子字符串 1.1模拟实现strstr函数 strstr函数:在一个字符串中查找子串 学习新函数时,先去c库查找该函数的相关资料,更加助于你的学习 const cha ...

  3. strstr函数的原理原来是这样的

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.strstr函数是什么? 二.strstr函数的参数及实现原理 1.参数 2.strstr函数的模拟使用 总结 前 ...

  4. 【C语言】 strstr查找子字符串函数以及模拟实现讲解

    strstr 字符串查找函数 返回的是相同子串的第一个出现的的地址   返回类型是 char* 返回的是相同子串的第一个出现的的地址   参数是 const char* str1 ,const cha ...

  5. C语言 strstr函数的用法及模拟实现strstr函数

    C语言 strstr函数的用法及模拟实现strstr函数 一.strstr函数的用法 二.模拟实现strstr函数的功能 一.strstr函数的用法 1.strstr函数原型:char* strstr ...

  6. 【C】字符串库函数及重点函数的模拟实现(下)—— strstr | strtok | strerror

    本文重点 8.strstr 9.strtok 10.strerror 本文将继续介绍字符串库函数,即重点函数的模拟实现. 8.strstr

  7. strstr函数和strtok函数的使用

    目录: strstr函数的使用 模拟实现strstr函数 strtok函数的使用 strstr函数定义:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串.如果是,则该 ...

  8. C语言——字符串+内存函数及其模拟实现

    目录 0. 思维导图 1. 前言 2. 函数介绍 2.1 strlen 2.2 strcpy 2.3 strcat 2.4 strcmp 2.5 strncpy 2.6 strncat 2.7 str ...

  9. 【C语言详解】——常见字符和字符串函数及其模拟实现

    本文主要介绍一些常见的字符和字符串函数及其模拟实现 所需要的头文件 #include<string.h> 目录 1.求字符串长度 strlen 1.1模拟实现 strlen(三种方法) 2 ...

最新文章

  1. 试用最新版本的live writer发一篇日志看看
  2. JSONP实现Ajax跨域请求
  3. MFC程序在控制台输出的实现
  4. 关于网页制作的规划与流程图的使用
  5. VTK:可视化之HanoiIntermediate
  6. 软件定义存储的定制化怎么走?
  7. 我就改了一行代码,为什么就全超时了?
  8. linux 中 id指令,Linux id 命令
  9. 前端学习(3247):react的生命周期getSnapBeforeUpdate举例
  10. http 错误 404.0 - not found_电脑Regsvr32 用法和错误消息的说明
  11. 数字安全控制系统行业调研报告 - 市场现状分析与发展前景预测
  12. 直接拿来用!Visual Studio 扩展工具利用 AI 强化你的代码
  13. 使用depot_tools下载chromium源码
  14. My97datepicker时间控件的简单使用
  15. DICOM世界观·第二章:[2]像素操作
  16. 前端图片上传问题整理
  17. Texture tiling
  18. 图片信息查看软件 ExifTool GUI
  19. #define的定义用法
  20. excel与access结合运用_当excel不够用时,如何利用Access进行数据分析?

热门文章

  1. 虚拟桌面的服务器,虚拟桌面与集合
  2. 模拟信号和数字信号讲堂(一),模拟信号和数字信号之模拟信号详解
  3. Settings学习总结(一)
  4. REW声学测试(四):REW的测试原理
  5. matplotlib中箱线图、极线图、阶梯图的绘制
  6. Java和C、C++比较
  7. 使用STM8单片机+NTC热敏电阻自制简易温度巡检仪
  8. 特征锦囊:怎么尽可能地修正数据倾斜的特征?
  9. 可视化入门:从 0 到 1 开发一个图表库
  10. [黑马程序员C++笔记]P99-P104类和对象-封装