目录

一,strstr函数简介

二,strstr函数实现原理

三,strstr函数的用法

四,strstr函数的注意事项

五,strstr函数的模拟实现


一,strstr函数简介

strstr函数是在一个字符串中查找另一个字符串的第一次出现,并返回该位置的指针,如果找不到,则返回NULL

🍂函数头文件: 

#include <string.h>

 🍂函数原型:

const char * strstr ( const char * str1, const char * str2 );

 str1:被查找的目标字符串

 str2:要查找的对象字符串

二,strstr函数实现原理

strstr函数的实现可以通过遍历字符串的方式来查找str2字符串的出现位置。

1,遍历str1字符串,逐个字符与str2字符串进行比较。

2,如果str1字符串的当前字符与str2字符串的第一个字符相等,则继续比较后续字符。

3,如果str1字符串中的连续字符str2字符串完全匹配,则返回该位置的指针。

4,如果str1字符串遍历完毕仍未找到匹配,则返回NULL。 

三,strstr函数的用法

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[] = "hello world!";
	char str2[] = "world!";
	char* ret = strstr(str1, str2);
	if (ret == NULL)
		printf("找不到!\n");
	else
		printf("%s\n", ret);

	return 0;
}

🎈运行结果: 

🎈释义: 

上述代码中,我们在字符串"hello world!"中查找字符串"world!"的第一次出现,并打印位置。如果找到了,则打印出从第一次找到的那个位置开始后面的所有字符;如果未找到,则打印“找不到”。

四,strstr函数的注意事项

在使用strstr函数时,需要注意以下几点:

1,函数返回的指针指向的是str1字符串中匹配到的位置,因此可以通过指针的偏移量来得到具体的位置。

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[] = "hello world!";
	char str2[] = "world!";
	char* ret = strstr(str1, str2);
	if (ret == NULL)
		printf("找不到!\n");
	else
	    printf("%d\n", ret - str1);

	return 0;
}

 🎈运行结果: 

 🎈释义:

上述代码中,我们在字符串str1中查找字符串str2的第一次出现,并打印位置。如果找到了,则打印出位置的偏移量;如果未找到,则打印“找不到”。

2,如果需要查找字符串的最后一次出现,可以配合使用strstr函数。

3,函数的参数str1和str2都应该是以'\0'结尾的字符串,否则可能会导致不可预料的结果。 

五,strstr函数的模拟实现

#include <stdio.h>
#include <string.h>
#include <assert.h>

const char* my_strstr(const char* str1, const char* str2)
{
	const char* cp;//记录开始匹配的位置
	const char* s1;//遍历str1指向的字符串
	const char* s2;//遍历str2指向的字符串
	assert(str1 && str2);//处理空指针的情况
	if (*str2 == '\0')//如果str2为空字符串,则返回str1
		return str1;
	cp = str1;
	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1 && *s2 && *s1 == *s2)//在str1中找到str2的第一个字符
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')//如果找到了str2的所有字符,则返回该位置的指针
			return cp;
		cp++;//否则,继续在str1中寻找下一个可能的位置
	}
	return NULL;//如果未找到匹配的位置,则返回NULL
}

int main()
{
	char str1[] = "hello world!";
	char str2[] = "world!";
	const char* ret = my_strstr(str1, str2);
	if (ret == NULL)
		printf("找不到!\n");
	else
		printf("%s\n", ret);

	return 0;
}
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐