1.strstr函数的用法strstr 查找子串的一个函数 。
首先让我们来看一下这个函数的函数原型。
const char* strstr(const char*str1,const char*str2)
str1为主字符串,str2为待查找的子串。 若查找成功则返回字串在串中的首元素的地址,否则返回空指针。
用法举例
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<string.h>int main(){ char arr1[] = "Hello 橘子真甜~"; char arr2[] = "Hello"; char* ret = strstr(arr1, arr2); if (ret == NULL) { printf("子串不存在\n"); } else { printf("%s\n", ret); } return 0;}其运行结果为
可见能找到子字符串并且返回了子串首元素的地址
再看下例代码
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<string.h>int main(){ char arr1[] = "Hello 橘子真甜~"; char arr2[] = "Hello?"; char* ret = strstr(arr1, arr2); if (ret == NULL) { printf("子串不存在\n"); } else { printf("%s\n", ret); } return 0;}其运行结果为
可见当找不到子串的时候会返回空指针
2.strstr函数使用过程中的注意点由于这个函数查找成功的返回值是返回的子串首个字符在母串中的地址
所以如果直接打印会从母串中的这个元素的地址开始向后打印
如上图就会打印出额外的橘子真甜~
3.strstr函数的模拟实现(实现算法为经典的BF算法)3.1实现代码为了方便理解BF算法,我们首先给出函数实现的代码
char* mystrstr(const char* str1, const char* str2){ assert(str1 && str2); const char* s1 = str1; const char* s2 = str2; const char* p = str1; while (*p) { s1 = p; s2 = str2; while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) { s1++; s2++; } if (*s2 == '\0') { return (char*)p; } p++; } return NULL;3.2BF算法实现思路BF算法是一种用来查找子字符串的算法
(1)首先我们定义两个指针s1和s2分别指向str1和str2,
(2)由于在循环判断的过程中str1要++所以要再定义一个p指针指向str1
(3)当s1!='\0'且s2!='\0'且s1与s2解引用相等的时候s1++且s2++
(4)若最后对s2解引用等于0时候说明查找成功并返回p的地址说明p的地址是子串的首地址
(5)若不等于0说明查找失败,则要从母串的第二个字符开始重新查找
(6)若一直没有查找成功(对p解引用等于\0的时候)则返回空指针
3.3测试代码和运行结果#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<assert.h>//abbbcdef// bbc//bf算法 char* mystrstr(const char* str1, const char* str2){ assert(str1 && str2); const char* s1 = str1; const char* s2 = str2; const char* p = str1; while (*p) { s1 = p; s2 = str2; while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) { s1++; s2++; } if (*s2 == '\0') { return (char*)p; } p++; } return NULL;}int main(){ char arr1[] = "hello 橘子真甜~"; char arr2[] = "橘子真甜~"; char* ret2 = mystrstr(arr1, arr2); if (ret2 == NULL) { printf("子串不存在\n"); } else { printf("%s\n", ret2); } return 0;}运行结果如下图
可见可以成功查找到子字符串
|