C语言之strstr函数的使用和模拟实现

C语言之strstr函数的模拟实现

文章目录

  • C语言之strstr函数的模拟实现
    • [1. strstr函数的介绍](#1. strstr函数的介绍)
    • [2. strstr函数的使用](#2. strstr函数的使用)
    • [3. strstr的模拟实现](#3. strstr的模拟实现)
      • [3.1 实现思路](#3.1 实现思路)
      • [3.2 实现代码](#3.2 实现代码)

1. strstr函数的介绍

函数声明如下:

c 复制代码
char * strstr ( const char * str1, const char * str2 );    

strstr函数是用于在字符串str1中找str2字符串第一次出现的位置,如果找到改位置,则将这个位置返回,找不到则返回一个空指针NULL

strstr函数比较元素时,不包含 \0,以 \0 作为结束的标志

2. strstr函数的使用

c 复制代码
#include <stdio.h>
#include <string.h>

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

如果arr1字符串中是否有arr2 def 这三个字符,必须得是连续的

然后用ret来接收strstr函数的返回值

如果arr1中有出现arr2这个字符串,则返回第一次出现的地址

否则则返回一个空指针

最后继续判断是否为空指针,如果不是则打印第一次出现的位置

运行结果如下:

3. strstr的模拟实现

3.1 实现思路

假设有两个字符数组

str1中的字符串为 a b b b c d e f \0

str2中的字符串为 b b c \0

当将这两个字符串传给strstr 函数时,传入的是首元素地址,所以str1 指向字符 a ,str2指向字符 b

  1. 要判断str1字符串中是否有str2字符串,首先,str1要从第一个元素开始比较,如果从第一个元素就错了,所以要通过指针偏移的方式来找到第二个元素,如果两个元素相同,那么str1 和 str2 都偏移一个字节找到下一对要比较的元素

  2. 当指针偏移到第二个元素的时候,当第二遍比较的时候,str1 和 str2 前两个字符都相同,此时str1指向第三个元素 b ,str2指向第二个元素 b ,然后str1 和 str2 都偏移一个字节找到下一个元素, str1 找到第四个元素 b,str2 找到第三个元素 c,此时两个元素不相同,str1 得回到比较时的位置,str2 得回到起始位置

3.所以我们可以定义两个指针变量用来记录str1比较时的位置,和str2的起始位置,假设为s1 和 s2

通过比较s1 和 s2 的元素,判断是否相符合,如果不符合s1 回到 str1的位置, s2回到 str2 的位置

然后str1++找到下一个元素,从这个元素开始比较,当s2指向\0的时候,则返回str1的地址,我们也可以定义一个cur来存放str1的地址,这样比较清晰一点

3.2 实现代码

c 复制代码
#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++;  //找到下一个元素
			//再次比较
		}
		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;
}

运行结果如下:

相关推荐
鹿鹿学长3 小时前
2025年全国大学生数学建模竞赛(C题) 建模解析|婴儿染色体数学建模|小鹿学长带队指引全代码文章与思路
c语言·开发语言·数学建模
伴杯猫3 小时前
【ESP32-IDF】基础外设开发2:系统中断矩阵
c语言·单片机·嵌入式硬件·mcu·物联网·github
Want5955 小时前
C/C++圣诞树①
c语言·开发语言·c++
l1t7 小时前
轻量级XML读写库Mini-XML的编译和使用
xml·c语言·解析器
小莞尔8 小时前
【51单片机】【protues仿真】基于51单片机停车场的车位管理系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
xianyinsuifeng9 小时前
Oracle 10g → Oracle 19c 升级后问题解决方案(Pro*C 项目)
c语言·数据库·oracle
学c语言的枫子10 小时前
数据结构——双向链表
c语言·数据结构·链表
3壹11 小时前
数据结构精讲:栈与队列实战指南
c语言·开发语言·数据结构·c++·算法
etcix12 小时前
dmenux.c: integrate dmenu project as one file
c语言·前端·算法
曙曙学编程14 小时前
stm32——独立看门狗,RTC
c语言·c++·stm32·单片机·嵌入式硬件