详解库函数strstr及模拟实现库函数strstr

strstr 函数是 C 语言标准库中的一个非常有用的字符串处理函数,它用于在一个字符串中查找另一个字符串首次出现的位置。以下是对 strstr 函数的详细解析:

一、函数原型

strstr 函数的原型定义在 <string.h> 头文件中,其基本语法如下:

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

二、参数说明

  • str1:指向要搜索的主字符串的指针。这是要在其中查找子字符串的字符串。
  • str2:指向要查找的子字符串的指针。这是要在主字符串中搜索的子字符串。

三、返回值

  • 如果 strstr 函数在 str1 中找到了 str2,则返回一个指向 str1 中 str2 首次出现位置的指针。这个位置是从 str1 的开头计数的,并指向 str2 的第一个字符在 str1 中的位置。
  • 如果 strstr 函数在 str1 中没有找到 str2,则返回 NULL 指针。

四、使用场景

  1. 查找子字符串strstr 最直接的应用就是在一个较长的字符串中查找一个较短的子字符串,并返回其首次出现的位置。
  2. 判断子字符串存在性:可以通过检查 strstr 的返回值是否为 NULL 来判断一个字符串是否是另一个字符串的子串。

五、示例代码

以下是一个简单的示例,展示了如何使用 strstr 函数:

#include <stdio.h>
#include <string.h>
int main() {
const char *haystack = "Hello, World!";
const char *needle = "World";
char *result = strstr(haystack, needle);
if (result != NULL) {
printf("Found substring: %s\n", result); // 输出从找到的位置开始到 haystack 结尾的字符串
// 也可以输出子串在主串中的位置
printf("'%s' first appears at position %ld\n", needle, result - haystack);
} else {
printf("Substring not found.\n");
}
return 0;
}

在这个示例中,strstr 函数查找子字符串 "World" 在主字符串 "Hello, World!" 中的首次出现,并返回指向该位置的指针。然后,程序打印出从该位置开始到主字符串结尾的字符串,并计算出子串在主串中的位置(从 0 开始计数)。

六、注意事项

  • strstr 函数是区分大小写的。如果需要忽略大小写进行搜索,可以使用自定义函数或第三方库中的函数,如 strcasestr(在某些平台上可用)。
  • 返回的指针指向的是 str1 中的一个位置,因此它不会创建一个新的字符串或复制找到的子字符串。
  • 当 str2 为空字符串("")时,strstr 会立即返回 str1 的起始位置。
  • 由于 strstr 返回一个指针,因此可以使用它来访问或操作找到的子字符串及其后面的字符。但是,要注意不要越界访问字符串的末尾或未初始化的内存区域。

七、模拟实现库函数strstr


//模拟库函数strstr
#include <stdio.h>
#include <string.h>
#include <assert.h>

char* my_strstr(const char* str1, const char* str2)
{
	const char* cur = str1;  //用cur用来记录当前的位置
	const char* s1 = NULL;   //通过s1 和 s2 比较元素
	const char* s2 = NULL;
	assert(str1 && str2);    //assert断言,如果传入的地址有有一个会空指针,则直接返回str1的地址
	if (str2 == '\0')
		return (char*)str1;
	while (*cur)   //当cur中的值不为'\0'时,进入循环
	{
		s1 = cur;   //s1回到比较时的位置
		s2 = str2;  //s2回到初始位置
		while (*s1 && *s2 && *s1 == *s2) //当s1和s2指向的值相等时,进入循环
		{
			s1++;  //找到下一个元素
			s2++;  //找到下一个元素
			//再次比较
		}
		if (*s2 == '\0')  //当s2中的元素为'\0'时,则说明在str1中找到了str2
			return (char*)cur; //返回当前的位置
		cur++; //第一次没找到,找到下一个元素重新寻找
	}
	return NULL; //如果在循环中没有找到,则返回一个空指针
}

int main()
{
	char arr1[] = "abcadefdef";
	char arr2[] = "def";
	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
	{
		printf("%s\n", ret);
	}
	else
	{
		printf("找不到\n");
	}
	return 0;
}

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值