c语言strstr的使用及模拟实现strstr函数
函数原型
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函数相关推荐
- 【C语言详解】——常见字符和字符串函数及其模拟实现
本文主要介绍一些常见的字符和字符串函数及其模拟实现 所需要的头文件 #include<string.h> 目录 1.求字符串长度 strlen 1.1模拟实现 strlen(三种方法) 2 ...
- C语言 strstr函数的用法及模拟实现strstr函数
C语言 strstr函数的用法及模拟实现strstr函数 一.strstr函数的用法 二.模拟实现strstr函数的功能 一.strstr函数的用法 1.strstr函数原型:char* strstr ...
- 【c语言】模拟库函数strstr
// 模拟库函数strstr#include <stdio.h> #include <assert.h>const char* my_strstr(const char *pa ...
- 【c语言】模拟实现字符串函数(上)
关关难过关关过 前路漫漫亦灿烂 今天 阿紫 就带领大家一起挑战字符串函数的模拟实现 目录 1.模拟实现strlen 1.1函数介绍 1.2函数的模拟实现 2.模拟实现strcpy 2.1函数介绍 2. ...
- 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr strtok(及其模拟实现)
系列文章目录 字符函数和字符串函数详解(一)strlen strcpy strcat strcmp 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr str ...
- java程序设计试题_《Java语言程序设计》期末考试模拟试题——填空题和编程题...
一.根据题意,填写出空格中的内容 Java平台包括三个技术方向,其中J2ME代表____________.J2SE代表___________.J2EE代表____________.2.面向对象的四大概 ...
- 模拟实现strstr
模拟实现strstr: 在系统库函数中,存在strstr函数,它用于查找子字符串.它的函数原型为: char *strstr( const char *string, const char *strC ...
- C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现
C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现 声明:本文非博主原创,转自https://blog.twofei.com/496/,博主读后受益良多,特地转载,一是希望好文能有更多人看到 ...
- C语言中用链表构建栈讲解,C语言数据结构之使用链表模拟栈的实例
C语言数据结构之使用链表模拟栈的实例 以下是"使用链表模拟栈"的简单示例: 1. 用C语言实现的版本 #include #include typedef char datatype ...
最新文章
- Thrift架构与使用方法
- Project interpreter not specified(eclipse+pydev)
- 5月份升级鸿蒙系统的华为手机名单,鸿蒙OS前三批升级名单曝光,华为荣耀手机可升级,幸福来得太突然...
- [BZOJ1097][POI2007]旅游景点atr
- 回归树与基于规则的模型(part1)--if-then语句
- lamp自动部署工具_Linux一键配置工具ezhttp介绍
- 大一计算机论文_计算机二级基础,60集全套视频教程+500习题,送给你参考下
- SystemTimer,TimerTaskList等源码分析
- java xmlutil_XmlUtil工具类(toxml()和toBean())
- mysql 设置外键约束SET FOREIGN_KEY_CHECKS=1
- Java基础0311
- 《跨境电商 —— 阿里巴巴速卖通实操全攻略》一一2.2 发布你的第一个产品...
- Python之禅 的翻译和解释
- 1354:括弧匹配检验
- echarts问题整理之多条基准线设置
- C++RTTI运算符
- 测试工作3年还在基础岗?可能只是因为你的工作能力差
- Ubuntu 安装 vim
- CFA一级学习笔记--权益(二)--头寸与杠杆
- Linux常用工具介绍