前言:本章我们将学习如何用strstr函数在字符串中查找是否存在指定的字符串。
strstr
功能:在一个字符串中查找是否存在指定的字符串(定位子字符串)
cplusplus介绍如下:(仅供参考,看不懂英文也没关系)
strstr函数具有2个参数,第一个参数str1是要扫描的C字符串,第二个参数str2为包含要匹配的字符序列的C字符串。
在字符串str1中找字符串str2,若是找到了,则返回字符产str2在字符串str1中第一次出现的位置,若是没找到,则返回空指针。
请看下面的示例代码(在 “abbbcdefg"中查找"bbc”):
#include<stdio.h>
#include<string.h> //引用字符串函数头文件
int main()
{
char str1[] = "abbbcdefg"; //要扫描的字符串
char str2[] = "bbc"; //要匹配的字符序列
printf("%s\n",strstr(str1, str2)); //打印
return 0;
}
打印结果为:
要匹配的字符序列为"bbc",从str1的首元素开始扫描,a(str1[0])不满足条件,则继续向后扫描。第二个元素b(str1[1])虽满足条件,但继续向后扫描到b(str[3])与要求的c不符合,则从b(str[2])开始重新扫描,发现符合条件,则返回b(str[2])的地址,因此打印的字符串为"bbcdefg"。
判断子字符串是否包含在要扫描字符串内
上文讲过,若是子字符串不包含在要扫描字符串类,则会返回一个空指针(NULL),因此可以通过此来判断子字符串是否包含在要扫描字符串内。
代码实现如下:
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "abbbcdefg";
char str2[] = "bbc";
char str3[] = "abc";
if (strstr(str1, str2) == NULL)
{
printf("str2不包含在str1中\n");
}
else
{
printf("str2包含在str1中\n");
}
if (strstr(str1, str3) == NULL)
{
printf("str3不包含在str1中\n");
}
else
{
printf("str3包含在str1中\n");
}
return 0;
}
输出结果如图:
模拟实现strstr(若有兴趣,可以看看)
模拟实现strstr时,要注意重复的情况这一点:比如在
"abbbc(str1)"
中查找"bbc(str2)"
,在扫描到b(str1[1])
势必会向后继续扫描,但是发现b(str1[3])
并不满足条件。下面应该从b(str1[2])
重新扫描,但是上面已经查找到了b(str1[3])
,怎么返回呢?因此,每次扫描时应该记住首个元素的地址,以方便扫描发现不符合要求后返回。
代码如下:
char* my_strstr(const char* arr,const char* str)
{
char* s1 = NULL;
char* s2 = NULL;
char* p = arr;
while (*p)
{
s1 = p;
s2 = str;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return p;
p++;
}
return NULL;
}
int main()
{
char arr[] = "abbbbcd";
char str[] = "bbc";
printf("%s\n", my_strstr(arr, str));
return 0;
}
文末BB:对哪里有问题的朋友,可以在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,希望朋友们给点点赞和关注。