strstr()

107 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

🚩write in front🚩

🔎大家好,我是泽奀,希望你看完后。能对你有所帮助,不足请指正,共同学习交流🔎
🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家^星级博主~掘金⇿InfoQ创作者~周榜77»总榜1766🏅
🆔本文由 謓泽 原创 掘金/CSDN/infoQ 如需转载还请通知⚠
📝个人主页-掘金 (juejin.cn)💬
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏-[C系列] 从0到1 - 泽奀的专栏 - 掘金 (juejin.cn)🎓
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

🎍strstr() - 在一个字符串中查找另外一个字符串🎍

strstr() 函数的声明方式如下 👇 

char *strstr(const char *haystack, const char *needle)

在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。

haystack→ 要被检索的 C 字符串。

needle→ 在 haystack 字符串内要搜索的小字符串。

该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。

注意:这里的返回值的指针类型可以是void也可以是char *🧨

🎍strstr()函数代码示例🎍

题目:在arr1中查找是否包含arr2中的数组。要求使用 strstr() 库函数。

使用 ****strncpy() ****函数代码示例如下 👇

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main(void)
{
	char arr1[20] = "abcdef";
	char arr2[20] = "bcd";
	char ret = strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("没找到!\n");
	}
	else
	{
		printf("找到了→%s\n", ret);
	}
	return 0;
}

运行结果如下 👇 

找到了→bcdef

那没找到的情况下,我们把 arr2 数组修改下。其它值不变🎉

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
int main(void)
{
	char arr1[20] = "abcdef";
	char arr2[20] = "bf";
	char *ret = strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("没找到%s!\n",ret);
	}
	else
	{
		printf("找到了→%s\n", ret);
	}
	return 0;
}

运行结果如下 👇 

找不到(null)!

对比之下,你发现了区别了没👀

🎍创建自定义函数实现strstr()🎍

分析思路🧐

其实很容易,我们只需要拿首字符地址进行比较相等的话返回,不相等的时候进行自增++(注意:这里自增++只需要str1进行++而str2依旧拿首元素地址跟它进行比较),再进行比较直到'\0',没有就返回空指针NULL。如果str1有元素和str2首元素地址匹配上了的话那么就继续往后走~但是,这个仅仅是假设 abcd 和 bcd 所适用的场景。如果是 bbbc 和 bbc,这种怎么办?是不是发现用这种思路不行,下面就用代码来讲解下怎么实现。

示例代码如下:👇  

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
char *my_strstr(const char *str1, const char *str2)
{
	assert(str1 && str2 != NULL);
	const char* s1 = NULL;
	const char* s2 = NULL;//在不知道赋值什么的情况下直接赋值空指针。
	if (*str2 == '\0')
		return (char*)str1;//假设str2首元素地址为空字符串直接返回str1
	while (*str1)
	{
		s1 = str1;
		s2 = str2;
		while (*s1 && *s2 != '\0' && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)str1;//注意返回类型强制转换!
		}
		str1++;
	}
	return NULL;
}
int main(void)
{
	char arr1[20] = "abbcdef";
	char arr2[20] = "bc";
	char *ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("没找到%s!\n",ret);
	}
	else
	{
		printf("找到了→%s\n", ret);
	}
	return 0;
}

运行结果如下 👇 

bcdef

这个代码的实现相对来说比上面的代码都要比较复杂,希望各位理解了可以自己上手做下,因为自有当你把代码打出来了,那么才是你学到的知识。