C语言模拟实现strstr函数

strstr函数指的是在目标字符串 string 中寻找是否存在子字符串 strCharSet.

先找到strstr函数定义:

char *strstr(const char *string, const char *strCharSet);

这里使用 char* 接收地址并且作为返回值。

并且接收的string 和 strCharSet地址使用了const修饰,所以这两个值不能修改。

模拟实现思路:

1、由于const修饰的地址不能被修改,并且这里后续运算需要变动指针的值,所以需要创建新的指针变量来进行运算。

2、我在这里创建了:

char* pd指针指向string

char* ps指针指向strCharSet

char* pdret进行数组的遍历运算

这里的pdret是零时变量,pd的作用只是找到两个字符串中相同元素的首字母,pdret的作用才是首字母后面的比较部分。

3、首先遍历找到string字符串中与 strCharSet字符串首元素 相同的字符,

然后从刚才找到的字符位置起,遍历比较两个字符串是否相等,

当* ps == 0,或者* pdret == 0时跳出循环

*ps == 0表示strCharSet为首字母的字符串遍历完成,字符串source是目标字符串dest的子字符串。

* pdret == 0表示string为首字母的字符串遍历完成,字符串source不是目标字符串dest的子字符串。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>

char *MyStrstr(const char *string, const char *strCharSet)
{
	assert(string != NULL);
	assert(strCharSet != NULL);

	char* pd = (char*)string;        //创建指针变量,需要强制类型转换
	char* ps = (char*)strCharSet;
	while (*pd)                      //pd指向字符为0结束循环
	{
		char* pdret = pd;            //创建零时变量pdret并初始化为pd
		ps = (char*)strCharSet;      //ps初始化为strCharSet

		while (*pdret != *ps)        //寻找pdret数组中与ps首字母相同的元素
		{
			pdret++;
		}
		pd = pdret;                  //将找到的首字母的位置赋给pd(这一步是为了提高效率)
		while (*ps++ == *pdret++)    //遍历判断相等
		{
			if (*ps == 0)            //strCharSet为首字母的字符串遍历完成
			{
				return pd;
			}
			else if (*pdret == 0)    //string为首字母的字符串遍历完成
			{
				break;
			}
		} 
		pd++;                        //pd加一
	}
	return NULL;                     //找不到返回空
}

int main()
{
	char dest[] = "aabbbbbcda";
	char source[] = "bbc";

	printf("%s\n", MyStrstr(dest, source)); 
	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KamikazePilot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值