[php内核分析]zend_memnstr函数

10 篇文章 0 订阅

头文件

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值