当前位置: 首页 > article >正文

【C语言进阶:刨根究底字符串函数】 strstr 函数

本节重点内容:

  • 深入理解strstr函数的使用
  • 学会strstr函数的模拟实现

⚡strstr

strstr的基本使用:

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

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

若目标字符串中出现多次源字符串的内容,返回第一次源字符串出现的位置。运行结果如下:


⚡strchr

和 strstr 函数比较类似的函数,用于找出一个字符在字符串中第一次出现的位置。

strchr 基本用法:

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

int main()
{
	char arr1[] = "abcdebcdef";
	char str = 'e';
	char* p = strchr(arr1, str);
	if (p == NULL)
	{
		printf("找不到");
	}
	else
	{
		printf("%s\n", p);
	}
	return 0;
}

运行结果如下:


⚡strrchr

strrchr 函数用于找出一个字符在字符串中最后一次出现的位置。

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

int main()
{
	char arr1[] = "abcdebcdef";
	char str = 'e';
	char* p = strrchr(arr1, str);
	if (p == NULL)
	{
		printf("找不到");
	}
	else
	{
		printf("%s\n", p);
	}
	return 0;
}

代码运行结果如下:


 ⚡模拟实现strstr函数 

strstr 函数的模拟实现也是数据结构中串的匹配实现的暴力算法:BF算法。

为了使匹配字符串的过程中,如果发生匹配失败,能够让str1指向目标字符串中字符的下一个字符,str2能够重新回到要找的字符串开始位置,我们需要使用双指针,一个用来记住当前位置,一个来方便匹配过程中指针的移动。

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

char* my_strstr(const char* str1, const char* str2)
{
	char* s1 = NULL;
	const char* s2 = NULL;
	const char* cp = str1;
	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cp;
		}
		cp++;
	}
	return NULL;
}

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

运行结果如下:


感谢大家能够看完这篇博客,创作时长,小伙伴们觉得我的博客对你有帮助,不妨留下你的点赞的收藏,关注我,带你了解不一样的C语言。

98b76a6f4a9c4ca88fd93da1188ac6f9.gif


http://www.kler.cn/a/2369.html

相关文章:

  • 【ETCD】【源码阅读】深入分析 storeTxnWrite.Put方法源码
  • React简单了解
  • 【开源免费】基于SpringBoot+Vue.JS房屋租赁管理系统(JAVA毕业设计)
  • aioice里面candidate固定UDP端口测试
  • go-zero(十四)实践:缓存一致性保证、缓存击穿、缓存穿透与缓存雪崩解决方案
  • git 删除鉴权缓存及账号信息
  • 【蓝桥杯】 C++ 数字三角形 动态规划 ⭐⭐
  • 方向导数与梯度
  • 【Linux】多线程
  • OpenCV入门(十八)快速学会OpenCV 17 直线检测
  • 幸福的烦恼:显卡算力太高而pytorch版本太低不支持
  • Power BI利用Python和Sql Server制作实时看板
  • nginx快速入门.跟学B站nginx一小时精讲课程笔记
  • 【百面成神】多线程基础16问,你能坚持到第几问
  • 技术人的管理学-业务管理
  • 扒一扒抖音是如何做线程优化的
  • Markdown常用语法(字体颜色)
  • Python生日蛋糕
  • 网络协议分析期末复习(四)
  • 【vue2】使用vue常见的业务流程与实现思路
  • Docker的可视化界面工具
  • CRC校验算法以及相关实现示例
  • 脱不下孔乙己的长衫,现代的年轻人该怎么办?
  • 百度文心一言正式亮相
  • Linux(网络基础---网络层)
  • 【Python入门第三十五天】Python丨文件打开