头文件
#include "zend_operators.h"
源代码:
static inline const char * zend_memnstr(const char *haystack /*目标符串*/,
const char *needle/*预查找字符串*/, int needle_len, char *end){
const char *p = haystack;//目标字符串首指针
const char ne = needle[needle_len-1];//预查找字符串的最后一个字符
if(needle_len == 1){//所查找的字符串是一个字符,则使用系统函数memchr
return (char *)memchr(p, *needle, (end-p));
}
if(needle_len > end-haystack){//所查找的字符串比目标字符串还长,则无需查找,直接返回找不着
return NULL;
}
end -= needle_len;//其实只要查找到end-neele_len位置就可以了
while(p<end){//从头指针一字符一字符地找
//如果头字符和尾字符同时匹配,则用memcmp比较是否已经找到
if((p = (char *)memchr(p, *needle, (end-p+1))) && ne == p[needle_len-1]){
if(!memcmp(needle, p, needle_len-1)){
return p;
}
}
if(p == NULL){//如果连头一个字符都没找着,则停止查找最合适
return NULL;
}
p++;//头指针向后移动一下
}
return NULL;//到尾了还没找着,则返回NULL
}