C语言strstr函数讲解

strstr函数使用方法

我们可以在cplusplus官网看到他的介绍是这样的
在这里插入图片描述
在这里插入图片描述

这个函数的用法是查找字符串在一个字符串str1中查找str2子字符串str1就是被查找的布标,str2是查找对象,查找str2第一次出现在str1中的位置,找到之后就返回第一次匹配的字符串的地址,如果未找到字符串就返回NULL,举个例子,一个字符串str1 = abcde ,另一个字符串 str2 = bcd 我们在str1中查找str子字符串出现的位置,找到之后就返回字符串str2在字符串str1中第⼀次出现的位置,找到之后打印出来就打印bcde,我们来看看代码

# include<stdio.h>
# include<string.h>
int main()
{
	char str1[]= "abcde";
	char str2[] = "bcd";
	char* ret = strstr(str1, str2);
	printf("%s", ret);
	return 0;
}

strstr函数包含在string.h头文件里面,下面是运行结果
在这里插入图片描述
我们可以看到我们成功打印了字符串,下面我们来改一下查找的字符串改成bcp
在这里插入图片描述
我们就发现返回的就是空值,因为字符串bcp根本不存在。
下面我们来看看strstr函数的实现原理

strstr函数的模拟实现

我们来看看代码

# include<stdio.h>
# include<string.h>
char* my_strstr(const char* str1, const char* str2)
{
	const char* pstr1 = NULL;
	const char* pstr2 = NULL;
	const char* temp = str1;
	if (*str2 == '\0')
	{
		return (char*)str1;
	}
	while (*temp)
	{
		pstr1 = temp;
		pstr2 = str2;
		while (*pstr1 != '\0' && *pstr2 != '\0' && *pstr1 == *pstr2)
		{
			pstr1++;
			pstr2++;
		}
		if (*pstr2 == '\0')
		{
			return (char*)temp;
		}
		temp++;
	}
	return NULL;
}
int main()
{
	char str1[]= "abcde";
	char str2[]= "bcd";
	char* ret = my_strstr(str1, str2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");
	return 0;
}

分部讲解

首先看看函数参数部分;

char* my_strstr(const char* str1, const char* str2)
{
	const char* pstr1 = NULL;
	const char* pstr2 = NULL;
	const char* temp = str1;

这里我们接受了两个charl类型的函数指针,并用const修饰指针变量,我们用const来修饰指针变量是为了保证我们传过来的字符串里面的元素不想被修改,所以用const来修饰限制一下,这个my_strstr函数要返回一个char类型的地址,然后我们用了创建了3个指针,pstr1和pstr2还有temp这三个指针,pstr1和pstr2指针赋值为NULL是因为我们现在不知道这个指针具体要做什么,就让他赋一个空值,如果指针暂时不知道要干什么就要把他赋一个空值,如果不赋,那么这个指针就会随便在内存中指向一个地方,这可是不行的,然后把str1赋值给temp,这个有什么用后面会说再看看下面的代码。

if (*str2 == '\0')
{
	return (char*)str1;
}
while (*temp!='\0')
{
	pstr1 = temp;
	pstr2 = str2;
	while (*pstr1 != '\0' && *pstr2 != '\0' && *pstr1 == *pstr2)
	{
		pstr1++;
		pstr2++;
	}
	if (*pstr2 == '\0')
	{
		return (char*)temp;
	}
	temp++;
}
return NULL;

下面就是程序主体了,这里有一个if判断(这里是一个非常特殊的情况)如果我们要查找的字符串传了一个,“ ”空字符的话空字符就是\0,那肯定就找不到,在C++标准库里面,如果遇到空字符串的话就直接返回str1,所以我们这里就返回str1,为什么要强制类型转换一下,那是因为const是不能改变我们指向空间的内容的,但是我们要返回去,返回去了之后我们不知道这个字符串他要干什么,所以要强制转换为char的指针变量,这样就可以修改字符串中的内容了(后面的强制类型转换也一个道理)
下面就是while循环,这里的判断条件是
temp!=‘\0’,temp指针对应的是str1也就是要查找的字符串,我们这里把pstr2 = str2;这里的把temp赋值给pstr1,假如我们一个字符串是abbcde要查找的子字符串是bcd我们的pstr1指向abbcde字符串的开头,pstr2指向bcd字符串的开头,如果*pstr1 != ‘\0’ && *pstr2 != ‘\0’ && *pstr1 == *pstr2满足这个条件时就证明str1和str2里面的一个元素相等然后两个指针都向后走一位,如果 *pstr2 == '\0’就代表子字符串里面的元素都比较完了就返回temp的地址,temp的作用是用来处理特殊情况的,假如说abbcde和bcd之间,有两个b,temp首先指向的是abbcde中的第一个b然后与bcd之间进行比较,他们两个相等指针都++,当比较到第二个的时候,就不相等了,这时候temp指针就从指向abbcde第二个b开始又从头比较,依此类推直到遇到\0,如果都没有就返回NULL。
下面就是打印字符串了

	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");
	return 0;
}

当返回的是空值时就没有找到子字符串,如果不是就找到了,并打印出来
在这里插入图片描述

相关推荐

  1. C语言第五十四弹---模拟使用strstr函数

    2024-03-14 14:46:01       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-14 14:46:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-14 14:46:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-14 14:46:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-14 14:46:01       20 阅读

热门阅读

  1. Vue中的知识点

    2024-03-14 14:46:01       23 阅读
  2. CXL (Compute Express Link) Technology——论文阅读

    2024-03-14 14:46:01       36 阅读
  3. c++面经

    2024-03-14 14:46:01       19 阅读
  4. 人类的谋算与量子计算

    2024-03-14 14:46:01       15 阅读
  5. 用C语言链表实现图书管理

    2024-03-14 14:46:01       18 阅读
  6. 算法刷题day30:递归

    2024-03-14 14:46:01       23 阅读
  7. Dijkstra&floyed

    2024-03-14 14:46:01       20 阅读
  8. 3. Linux标准I/O库

    2024-03-14 14:46:01       18 阅读
  9. Linux 学习笔记(15)

    2024-03-14 14:46:01       20 阅读
  10. vue常用6种数据加密方式的使用

    2024-03-14 14:46:01       17 阅读