仿照strstr的内存查找函数

strstr是用于字符串中查找第一个匹配字符串所在位置的函数,但是在一段内存中,要查找匹配的字符串,就不行。

毕竟,内存中,可能有'/0',碰到'/0',strstr就返回了,因此,我重新作了一个函数memstr,以方便在内存中也能查找字符串,另外还有一些扩展函数等等。

//在一段内存缓冲中查找指定字符串的位置,从头开始查找,不区分大小写。
//返回第一个找到的位置。
//str1 - 内存缓冲的头指针
//nLen1 - 内存缓冲长度
//str2 - 要查找匹配的字符串
char * memstr(const char * str1, int nLen1, const char * str2)
{
    if ((NULL == str1) || (NULL == str2) || (nLen1 <= 0))
        return NULL;
 
    long ls1 = nLen1;
    char *cp = (char *) str1;
    char *s1, *s2;

    if ( !*str2 )
        return((char *)str1);

    while (ls1 > 0)
    {
        s1 = cp;
        s2 = (char *) str2;

        while ( *s1 && *s2 && !(*s1-*s2) )
            s1++, s2++;
 
        if (!*s2)
            return(cp);
 
        cp++;
        ls1--;
    }

    return(NULL);
}

//===========================================
//
bool bcompi(BYTE byA, BYTE byB)
{
    if (byA - byB == 0)
    {
        return true;
    }
    else
    {
        if (!((byA >= 'A' && byA <= 'Z') || (byA >= 'a' && byA <= 'z')))
            return false;

        if (!((byB >= 'A' && byB <= 'Z') || (byB >= 'a' && byB <= 'z')))
            return false;

        if ((byA - byB == 'a' - 'A') || (byB - byA == 'a' - 'A'))
            return true;
        else
            return false;
    }
}

//在一段内存缓冲中查找指定字符串的位置,从头开始查找,区分大小写。调用bcompi()
//返回第一个找到的位置。
char * memistr(const char * str1, int nLen1, const char * str2)
{
    if ((NULL == str1) || (NULL == str2) || (nLen1 <= 0))
        return NULL;
 
    long ls1 = nLen1;
    char *cp = (char *) str1;
    char *s1, *s2;
 
    if ( !*str2 )
        return((char *)str1);
 
    while (ls1 > 0)
    {
        s1 = cp;
        s2 = (char *) str2;
 
        while ( *s1 && *s2 && bcompi(*s1, *s2) )
            s1++, s2++;
 
        if (!*s2)
            return(cp);
  
        cp++;
        ls1--;
    }
 
    return(NULL);
}

//===========================================
//在一段内存缓冲中查找指定字符串的位置,从尾部开始查找,不区分大小写。
//返回第一个找到的位置。
char * memstrrev(const char * str1, int nLen1, const char * str2)
{
    if ((NULL == str1) || (NULL == str2) || (nLen1 <= 0))
        return NULL;

    long ls2 = strlen(str2);
    long ls1 = nLen1 - ls2;

    char *cp = (char *)(str1 + ls1);
    char *s1, *s2;
 
    if ( !*str2 )
        return((char *)str1);
 
    while (ls1 > 0)
    {
        s1 = cp;
        s2 = (char *)str2;

        while ( *s1 && *s2 && !(*s1-*s2) )
            s1++, s2++;

        if (!*s2)
            return(cp);
 
        cp--;
        ls1--;
    }

    return(NULL);
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

drg_aguai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值