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…