C/C++实现strstr函数、KMP算法查找子串

C/C++实现strstr、KMP算法查找子串


1、字符串形式

代码实现:

char* my_strstr(const char* src, const char* dst)
{
	const char* sp, *dp;

	if(src == NULL || dst == NULL)    return NULL;

	while(*src != 0)
	{
		sp = src;
		dp = dst;

		while(*sp++ == *dp++)
		{
			if(*dp == 0)    return (char *)src;
		}

		src++;
	}

	return NULL;
}

测试:

2、字节流形式

int mymatch(const void* src, uint32_t ssize, const void* dst, uint32_t dsize)
{
	int i = 0, j = 0, k = 0;
	const uint8_t* s;
	const uint8_t* d;

	for(i = 0; i < ssize; i++)
	{
		s = &(((const uint8_t *)src)[i]);
		d = &(((const uint8_t *)dst)[0]);
		for(k = 0; k < dsize; k++)
		{
			if(*d++ == *s++)
				if(++j == dsize)
					return i;
		}
	}

	return (int)-1;
}


//
// 在已有的字符串中,提取起始字符串和结束字符串区间内的串
// 示例:在[const char* s = "##0101;ST=32;PW=123456;MN=01238293864713;\r\n"]中提取出PW字段的内容
// strmatch(s, "PW=", ";", buf, sizeof(buf)),提取到的"123456"将存放于buf中。
//
// str:原字符串
// s1:起始字符串
// s2:结束字符串
// buf:存放提取到的区间字符串
// size:buf的大小
// 返回值:<0:未找到  >=0:匹配到的字符串的长度
//
int strmatch(const char* str, const char* s1, const char* s2, char* buf)
{
	int ret = 0;
	int matched = 0;
	const char* sp = (const char*)str;
	const char* ep = (const char*)str;

	if(!s1)
	{
		goto __flag;
	}

	sp = strstr(str, s1);
	if(!sp)
	{
		ret = -1;
		goto __exit;
	}

	sp += strlen(s1);

__flag:

	if(!s2)
	{
		matched = strlen(str) - (sp - str);
		goto __exit;
	}

	ep = strstr(sp, s2);
	if(!ep)
	{
		ret = -2;
		goto __exit;
	}

	matched = ep - sp;

__exit:
	if(matched != 0)
	{
		memcpy(buf, sp, matched);
		buf[matched] = 0;
		ret = matched;
	}
	return ret;
}

//
// 在已有的字符串中,提取起始字符串和结束字符串区间内的串
// 示例:在[const char* s = "##0101;ST=32;PW=123456;MN=01238293864713;\r\n"]中提取出PW字段的内容
// strmatch(s, "PW=", ";", buf, sizeof(buf)),提取到的"123456"将存放于buf中。
//
// str:原字符串
// s1:起始字符串
// s2:结束字符串
// buf:存放提取到的区间字符串
// size:buf的大小
// 返回值:<0:未找到  >=0:匹配成功并存储进buf缓存当中的的字符串的长度
//
int strnmatch(const char* str, const char* s1, const char* s2, char* buf, uint32_t size)
{
	int ret = 0;
	int matched = 0;
	const char* sp = (const char*)str;
	const char* ep = (const char*)str;

	if(!s1)
	{
		goto __flag;
	}

	sp = strstr(str, s1);
	if(!sp)
	{
		ret = -1;
		goto __exit;
	}

	sp += strlen(s1);

__flag:

	if(!s2)
	{
		matched = strlen(str) - (sp - str);
		goto __exit;
	}

	ep = strstr(sp, s2);
	if(!ep)
	{
		ret = -2;
		goto __exit;
	}

	matched = ep - sp;

__exit:
	if(matched != 0)
	{
		if(matched > size)
		{
			matched = size - 1;
		}
		memcpy(buf, sp, matched);
		buf[matched] = 0;
		ret = matched;
	}
	return ret;
}


ends…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

觉皇嵌入式

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

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

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

打赏作者

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

抵扣说明:

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

余额充值