string不区分大小写替换


char * stristr (const char * str1, const char * str2)
{
    char *cp = (char *) str1;
    char *s1, *s2;

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

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

        while ( *s1 && *s2 && toupper(*s1)==toupper(*s2) ){
            s1++, s2++;
        }

        if (!*s2)
            return(cp);

        cp++;
    }

    return(NULL);
}

// Replace all occurrences of string 'pszOld' with string 'pszNew'
int replacei( const char * pszSrc, int iStart, const char * pszOld, const char * pszNew, char** ppszOut, int* pLenOut)
{
    // can't have empty or NULL lpszOld
    // nSourceLen is in XCHARs
    int nSourceLen = strlen( pszOld );
    if( nSourceLen == 0 )
        return( 0 );
    if(iStart < 0)
        return( 0 );
    // nReplacementLen is in XCHARs
    int nReplacementLen = strlen( pszNew );
    int nOldLength = strlen(pszSrc);
    iStart = iStart > nOldLength ? nOldLength : iStart;

    // loop once to figure out the size of the result string
    int nCount = 0;
    {
        char * pszStart = (char *)pszSrc + iStart;
        const char * pszEnd = pszStart + nOldLength - iStart;
        while( pszStart < pszEnd )
        {
            char * pszTarget;
            while( (pszTarget = stristr( pszStart, pszOld ) ) != NULL)
            {
                nCount++;
                pszStart = pszTarget+nSourceLen;
            }
            pszStart = pszStart +1;
        }
    }

    // if any changes were made, make them
    if( nCount > 0 )
    {
        // if the buffer is too small, just
        //   allocate a new buffer (slow but sure)
        int nNewLength = nOldLength+(nReplacementLen-nSourceLen)*nCount + 1;
        *pLenOut = nNewLength;

        char* pszBuffer = (char*)malloc(nNewLength);
        *ppszOut = pszBuffer;

        char* pszStart = (char *)pszSrc + iStart;
        char* pszEnd = pszStart+nOldLength-iStart;
        char* pszStartBuffer = pszBuffer;
        
        // copy front string
        memcpy(pszStartBuffer, pszSrc, iStart);
        pszStartBuffer += iStart;

        // loop again to actually do the work
        while( pszStart < pszEnd )
        {
            char* pszTarget;
            while( (pszTarget = stristr( pszStart, pszOld ) ) != NULL )
            {
                int nMove = pszTarget - pszStart;
                memcpy(pszStartBuffer, pszStart, nMove);
                memcpy(pszStartBuffer+nMove, pszNew, nReplacementLen);
                pszStart = pszTarget+nSourceLen;
                pszStartBuffer = pszStartBuffer+nMove+nReplacementLen;
                *pszStartBuffer = 0;
            }

            memcpy(pszStartBuffer, pszStart, pszEnd-pszStart);
            pszStartBuffer = pszStartBuffer+(pszEnd-pszStart);
            *pszStartBuffer = 0;
            pszStart = pszEnd;
        }
    }
    else
    {
        if(nOldLength > 0)
        {
            *pLenOut = nOldLength;
            *ppszOut = (char*)malloc(nOldLength+1);
            memcpy(*ppszOut, pszSrc, nOldLength);
            *(ppszOut + nOldLength) = 0;
        }
    }

    return( nCount );
}

从微软CString::Replace抄的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值