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;
}