函数原型

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

需要的头文件string.h

从原型可以看出它的返回值为const char*一个字符类型的常量指针

参数

str1

要扫描的字符串

str2

包含要查找的字符串

括号里要传入的值也是两个指针,也用了const修饰,为什么是常量等到下面模拟实现时再进行说明

使用方法直接上代码说明

#include<stdio.h>
#include<string.h>int main()
{char str[] = "Hello World";                   //要扫描的字符串。char str2[] = "llo";                          //要查找的字符串char* a = strstr(str,str2);if (a != NULL)                                       {printf("%s\n", a);printf("%p\n", a);}else if (a == NULL){printf("没有找到");printf("%p\n", a);}}

看看结果

第一个结果为要查找的字符串 的 第一个字符往后的所有内容

下面的结果是这个a储存的地址.

这个地址是什么呢?也直接用代码来说明下

#include<stdio.h>
#include<string.h>int main()
{char str[] = "Hello Worldllo";                   //要扫描的字符串。char str2[] = "llo";                             //要查找的字符串printf("%p\n",&str[2]);//打印一下 被查找字符串 中 要查找字符串 的第一个字符出现的地址char* a = strstr(str,str2);if (a != NULL)                                       {printf("%s\n", a);printf("%p\n", a);}else if (a == NULL)                                  //a == NULL就打印{printf("没有找到");printf("%p\n", a);}}

看看结果

可以看到  要扫描的字符串中  与   要查找的的字符串   的第一个字符出现的地址与strstr的返回值一样这就说明了strstr返回的就是   要查找的字符串  第一个  字符出现的地址,后面的后面还有一个  "llo"  strstr就不理了它只找一次就罢工了,有点懒

下面来看看搜索不到的情况

#include<stdio.h>
#include<string.h>int main()
{char str[] = "Hello World";                   //要扫描的字符串char str2[] = "lll";                          //要查找的字符串char* a = strstr(str,str2);if (a != NULL)                                       {printf("%s\n", a);printf("%p\n", a);}else if (a == NULL)                                  //a == NULL就打印{printf("没有找到\n");printf("%p\n", a);}}

看看结果

没找到就直接返回一个空指针了

下面来模拟实现下strstr

直接上代码

#include<stdio.h>const char* sstrstr(const char* str, const char* str2)
{int i = 0;int j = 0;                               //用于循环要查找的数组while(*(str + i) != '\0'){if (*(str + i) == *(str2 + j))                    //进行判断  如果开始等于了进入下面的循环{while (1)                                     //这里不会死循环的,下面有终止条件,不用担心{if (*(str + i) == *(str2 + j))            //进行判断如果还等于,就继续循环{i++;j++;if (*(str2 + j) == '\0')              //判断如果  要查找的字符串  循环完了就返回它第一个字符出现的地址{return (str + i - j);              //可能还有人不懂,这里再进行说明函数只要一遇到return就会直接停止,整个函数停止}}else if(j == 1)                           //如果j只加了一次就只需j置为0就行,为什么呢?下面用文字说明,代码里不说那么多{j = 0;break;}else                                      //其他情况就i - 1,同时j也要置为0;{i = i - 1;j = 0;break;                                }}}else                                             //什么都没找到i++继续找就完事了{i++;}}return NULL;                                         //如果没找到就返回空指针
}int main()
{char arr[] = "acccbbbcbbbcddddddddd";char arr2[] = "cbbb";char* a = sstrstr(arr, arr2);                      //a用于接收返回的值if (a != NULL)                                       {printf("%s\n", a);}else if (a == NULL)                                  //a == NULL就打印{printf("没有找到");}
}

跑下看看结果

结果正确

看看没找到的情况

#include<stdio.h>const char* sstrstr(const char* str, const char* str2)
{int i = 0;int j = 0;                               //用于循环要查找的数组while(*(str + i) != '\0'){if (*(str + i) == *(str2 + j))                    //进行判断  如果开始等于了进入下面的循环{while (1)                                     //这里不会死循环的,下面有终止条件,不用担心{if (*(str + i) == *(str2 + j))            //进行判断如果还等于,就继续循环{i++;j++;if (*(str2 + j) == '\0')              //判断如果  要查找的字符串  循环完了就返回它第一个字符出现的地址{return (str + i - j);              //可能还有人不懂,这里再进行说明函数只要一遇到return就会直接停止,整个函数停止}}else if(j == 1)                           //如果j只加了一次就只需j置为0就行,为什么呢?下面用文字说明,代码里不说那么多{j = 0;break;}else                                      //其他情况就i - 1,同时j也要置为0;{i = i - 1;j = 0;break;                                }}}else                                             //什么都没找到i++继续找就完事了{i++;}}return NULL;                                         //如果没找到就返回空指针
}int main()
{char arr[] = "acccbbbcbbbcddddddddd";char arr2[] = "cbcb";char* a = sstrstr(arr, arr2);                      //a用于接收返回的值if (a != NULL)                                       {printf("%s\n", a);}else if (a == NULL)                                  //a == NULL就打印{printf("没有找到\n");}
}

康康结果

结果正确!

下面我单独分出这个函数,来进行说明

#include<stdio.h>const char* sstrstr(const char* str, const char* str2)
{int i = 0;int j = 0;                               //用于循环要查找的数组while(*(str + i) != '\0'){if (*(str + i) == *(str2 + j))                    //进行判断  如果开始等于了进入下面的循环{while (1)                                     //这里不会死循环的,下面有终止条件,不用担心{if (*(str + i) == *(str2 + j))            //进行判断如果还等于,就继续循环{i++;j++;if (*(str2 + j) == '\0')              //判断如果  要查找的字符串  循环完了就返回它第一个字符出现的地址{return (str + i - j);              //可能还有人不懂,这里再进行说明函数只要一遇到return就会直接停止,整个函数停止}}else if(j == 1)                           //如果j只加了一次就只需j置为0就行,为什么呢?下面用文字说明,代码里不说那么多{j = 0;break;}else                                      //其他情况就i - 1,同时j也要置为0;{i = i - 1;j = 0;break;                                }}}else                                             //什么都没找到i++继续找就完事了{i++;}}return NULL;                                         //如果没找到就返回空指针
}

代码挺长的

看到 i 减 1 那段注释为什么i 要减1呢我们下面用代码说明

我们看看把 i  -  1 去掉看看会发生什么

#include<stdio.h>const char* sstrstr(const char* str, const char* str2)
{int i = 0;int j = 0;                               //用于循环要查找的数组while(*(str + i) != '\0'){if (*(str + i) == *(str2 + j))                    //进行判断  如果开始等于了进入下面的循环{while (1)                                     //这里不会死循环的,下面有终止条件,不用担心{if (*(str + i) == *(str2 + j))            //进行判断如果还等于,就继续循环{i++;j++;if (*(str2 + j) == '\0')              //判断如果  要查找的字符串  循环完了就返回它第一个字符出现的地址{return (str + i - j);              //可能还有人不懂,这里再进行说明函数只要一遇到return就会直接停止,整个函数停止}}else if(j == 1)                           //如果j只加了一次就只需j置为0就行,为什么呢?下面用文字说明,代码里不说那么多{j = 0;break;}else                                      //其他情况就i - 1,同时j也要置为0;{j = 0;break;                                }}}else                                             //什么都没找到i++继续找就完事了{i++;}}return NULL;                                         //如果没找到就返回空指针
}int main()
{char arr[] = "acccbbbcbbbcddddddddd";char arr2[] = "ccb";char* a = sstrstr(arr, arr2);                      //a用于接收返回的值if (a != NULL)                                       {printf("%s\n", a);}else if (a == NULL)                                  //a == NULL就打印{printf("没有找到\n");}
}

看看结果

欸?什么情况?ccb不是有吗?为什么找不到?

现在用语言来解释下

截出要扫描的字符串ccb那段地方来进行说明

"cccbbb"

现在把自己想象成循环设置 i 为↑; i < 6 ; i++,我现在要搜索ccb设 j 为! j < 3

现在指向第一个字符

c c c b b b

诶,真幸运第一个就看到c了

那 j  就开始和 i 一起++

c c c b b b

c c b

!

往后

c c c b b b

c c b

!

往后

c c c b b b

c c b

!

诶,不一样了 j 遗憾置为0

但是 i 呢? i 兄弟没减1,他现在停在了c c c 最后一个c 那里

现在i++

c c c b b b

这样在这段字符串中就找不到ccb了

但是再看看你们可能看出来了c应该-2才能到达c c b 的第一个c啊,是不是说错了呢?

我们再看看代码

const char* sstrstr(const char* str, const char* str2)
{int i = 0;int j = 0;                               //用于循环要查找的数组while(*(str + i) != '\0'){if (*(str + i) == *(str2 + j))                    //进行判断  如果开始等于了进入下面的循环{while (1)                                     //这里不会死循环的,下面有终止条件,不用担心{if (*(str + i) == *(str2 + j))            //进行判断如果还等于,就继续循环{i++;j++;if (*(str2 + j) == '\0')              //判断如果  要查找的字符串  循环完了就返回它第一个字符出现的地址{return (str + i - j);              //可能还有人不懂,这里再进行说明函数只要一遇到return就会直接停止,整个函数停止}}else if(j == 1)                           //如果j只加了一次就只需j置为0就行,为什么呢?下面用文字说明,代码里不说那么多{j = 0;break;}else                                      //其他情况就i - 1,同时j也要置为0;{i = i - 1;j = 0;break;                                }}}else                                             //什么都没找到i++继续找就完事了{i++;}}return NULL;                                         //如果没找到就返回空指针
}

由上到下看下第一个i++的位置和第第二个i++的位置第一个i++在第二层循环的if判断里

第二个是在第一层循环的if判断里,而第二层循环也在第一层循环的判断里

而if只会执行其中一个,再看看第二层循环里的 if 也是只会执行其中一个

因为最后字母一个不相等,j 不等于1就执行最后一个

此时 i 没有再++了所以直接减去 1 就行

为什么j==1时i不用减去1呢?

同样把自己当成循环设置 i 为↑; i < 6 ; i++,我现在要搜索ccb设 j 为! j < 3

设置要扫描的字符串为ccbbc

要搜索cbb

开始跑

c c b b c

诶运气真好第一个就是

开始跑j

c c b b c

c b b

!

c c b b c

c b b

不一样了,i 减去1,j  置0;

i 减去 1 后退回

c c b b c

诶,已经出问题了

又跑回了第一位

这样就会造成死循环了

至于指针为什么是常量呢?看看代码写得这么长,如果中途有点什么操作不小心把指针的值改了就不好了.

好了模拟strstr就讲到这,怎么样简单吧?

如果还有什么地方不懂,或者代码中还有什么bug,欢迎提出,问题的话如果在我力所能及的范围我会回答的。

感谢大家的阅读

c语言strstr的使用及模拟实现strstr函数相关推荐

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

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

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

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

  3. 【c语言】模拟库函数strstr

    // 模拟库函数strstr#include <stdio.h> #include <assert.h>const char* my_strstr(const char *pa ...

  4. 【c语言】模拟实现字符串函数(上)

    关关难过关关过 前路漫漫亦灿烂 今天 阿紫 就带领大家一起挑战字符串函数的模拟实现 目录 1.模拟实现strlen 1.1函数介绍 1.2函数的模拟实现 2.模拟实现strcpy 2.1函数介绍 2. ...

  5. 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr strtok(及其模拟实现)

     系列文章目录 字符函数和字符串函数详解(一)strlen strcpy strcat strcmp 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr str ...

  6. java程序设计试题_《Java语言程序设计》期末考试模拟试题——填空题和编程题...

    一.根据题意,填写出空格中的内容 Java平台包括三个技术方向,其中J2ME代表____________.J2SE代表___________.J2EE代表____________.2.面向对象的四大概 ...

  7. 模拟实现strstr

    模拟实现strstr: 在系统库函数中,存在strstr函数,它用于查找子字符串.它的函数原型为: char *strstr( const char *string, const char *strC ...

  8. C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现

    C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现 声明:本文非博主原创,转自https://blog.twofei.com/496/,博主读后受益良多,特地转载,一是希望好文能有更多人看到 ...

  9. C语言中用链表构建栈讲解,C语言数据结构之使用链表模拟栈的实例

    C语言数据结构之使用链表模拟栈的实例 以下是"使用链表模拟栈"的简单示例: 1. 用C语言实现的版本 #include #include typedef char datatype ...

最新文章

  1. Thrift架构与使用方法
  2. Project interpreter not specified(eclipse+pydev)
  3. 5月份升级鸿蒙系统的华为手机名单,鸿蒙OS前三批升级名单曝光,华为荣耀手机可升级,幸福来得太突然...
  4. [BZOJ1097][POI2007]旅游景点atr
  5. 回归树与基于规则的模型(part1)--if-then语句
  6. lamp自动部署工具_Linux一键配置工具ezhttp介绍
  7. 大一计算机论文_计算机二级基础,60集全套视频教程+500习题,送给你参考下
  8. SystemTimer,TimerTaskList等源码分析
  9. java xmlutil_XmlUtil工具类(toxml()和toBean())
  10. mysql 设置外键约束SET FOREIGN_KEY_CHECKS=1
  11. Java基础0311
  12. 《跨境电商 —— 阿里巴巴速卖通实操全攻略》一一2.2 发布你的第一个产品...
  13. Python之禅 的翻译和解释
  14. 1354:括弧匹配检验
  15. echarts问题整理之多条基准线设置
  16. C++RTTI运算符
  17. 测试工作3年还在基础岗?可能只是因为你的工作能力差
  18. Ubuntu 安装 vim
  19. CFA一级学习笔记--权益(二)--头寸与杠杆
  20. Linux常用工具介绍

热门文章

  1. vs未找到导入的项目,请确认 声明中的路径正确
  2. Idea工具如何使用
  3. 2022年江苏专转本计算机大类考生经验分享(上岸南工程)
  4. 5s进水不开机怎么办 苹果5s进水后无法开机的维修方法
  5. 手把手教你使用Python抓取QQ音乐数据!
  6. DDR 6 内存已经投入研发
  7. 【sigma 协议】
  8. AutoLayout Label 自适应宽高
  9. one world,one dream
  10. Python中Scrapy框架的代理使用