c实现的字符串查找函数

1. c++貌似有这样的方法,我用c代码实现了一遍,没有实现算法优化。可以解决基本的字符串查找需求。

/*** 返回 buf找到的与expr完全匹配的第一项的第一个字符的索引
   * zgr 2013-05-23
   * buf-源字符串
   * offset-源字符串偏移-从偏移量往后搜索
   * expr-匹配字符串
   * bufMaxLen-源字符串长度
   */
int findFirst(const char* buf, int offset, const char* expr, int bufMaxLen)
{
	if(buf == NULL || offset<0 || offset>bufMaxLen-1)
	{
		return -1;
	}
	const char* p1;
	const char* p2;
	p1 = buf+offset;
	p2 = expr;
	int curoffset = offset;
	int sameTimes = 0;
	int exprOffSet = -1;
	while(curoffset<bufMaxLen)
	{
		if(*p1==*p2 && sameTimes==0)
		{
			exprOffSet = curoffset;
			p1++;
			p2++;
			curoffset++;
			sameTimes++;
		}
		else if(*p1==*p2 && sameTimes<strlen(expr))
		{
			p1++;
			p2++;
			curoffset++;
			sameTimes++;
			if(sameTimes==strlen(expr))
			{
				return exprOffSet;
			}
		}
		else
		{
			if(exprOffSet>=0)
			{
				p1 = buf+exprOffSet+1;
				p2 = expr;
				curoffset = exprOffSet+1;
				sameTimes = 0;
				exprOffSet = -1;
			}
			else
			{
				p1++;
				curoffset++;
			}
		}
	}
	return -1;
}
这个是从后往前查找

/*** 返回 buf找到的与expr完全匹配的最后一项的第一个字符的索引
   * zgr 2013-05-23
   * buf-源字符串
   * expr-匹配字符串
   * bufMaxLen-源字符串长度
   */
int findLast(const char* buf, const char* expr, int bufMaxLen)
{
	if(buf==NULL || bufMaxLen<0 || expr==NULL)
	{
		return -1;
	}
	const char* p1;
	const char* p2;
	p1 = buf+bufMaxLen-1;
	p2 = expr+strlen(expr)-1;
	int curoffset = bufMaxLen-1;
	int sameTimes = 0;
	int exprOffSet = -1;
	while(curoffset>=0)
	{
		if(*p1==*p2 && sameTimes==0)
		{
			exprOffSet = curoffset;
			p1--;
			p2--;
			curoffset--;
			sameTimes++;
		}
		else if(*p1==*p2 && sameTimes<strlen(expr))
		{
			sameTimes++;
			if(sameTimes==strlen(expr))
			{
				return exprOffSet-(strlen(expr)-1);
			}
			p1--;
			p2--;
			curoffset--;
		}
		else
		{
			if(exprOffSet>=0)
			{
				p1 = buf+(exprOffSet-1);
				p2 = expr+strlen(expr)-1;
				curoffset = exprOffSet-1;
				sameTimes = 0;
				exprOffSet = -1;
			}
			else
			{
				p1--;
				curoffset--;
			}
		}
	}
	return -1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值