前一段工作中用到了,找了几个方法。都实现了一下,测试了下,都差不多,glibc的实现方法相比还是快一些,stristrex也不慢,至于qi_strnstr,是自己的一个想法实现的,不过可悲的是,他是最慢的。
char *glibc_strnstr (const char *phaystack, const char *pneedle, int len)
{
typedef unsigned chartype;
const unsigned char *haystack, *needle;
const unsigned char *rneedle;
chartype b;
const unsigned char *pEnd = (const unsigned char *)phaystack + len;
haystack = (const unsigned char *) phaystack;
if ((b = *(needle = (const unsigned char *) pneedle)))
{
chartype c;
haystack--; /* possible ANSI violation */
{
chartype a;
do
{
a = *++haystack;
if (pEnd == haystack)
goto ret0;
}
while (a != b);
}
if (!(c = *++needle))
goto foundneedle;
++needle;
goto jin;
for (;;)
{
{
chartype a;
if (0)
jin:{
if ((a = *++haystack) == c)
goto crest;
}
else
a = *++haystack;
do
{
for (; a != b; a = *++haystack)
{
if (pEnd <= haystack || pEnd <= haystack + 1 )
goto ret0;
if ((a = *++haystack) == b)