C++实现字符串替换

文章详细描述了一个C/C++函数Str_ReplaceA和其宽字节版本Str_ReplaceW,它们在源字符串中直接进行替换操作,无需额外存储空间,但要求源字符串内存足够大以容纳替换后的结果。
摘要由CSDN通过智能技术生成

//Str_ReplaceA:字符串替换(窄字节),在源字符串中直接操作;
//pstrString:指向要执行替换的源字符串[输入][输出],内容不可以为空;
//ulMaximumimum:声明pstrString指向的内存可以容纳的最大字节量(含空中止);
//pstrSearch:指向需要被替换掉的字符串内容,内容不可以为空;
//pstrReplace:指向用于替换的新字符串内容,内容可以为空.
bool Str_ReplaceA (char    * pstrString, unsigned long ulMaximumimum, const char    * pstrSearch, const char    * pstrReplace)
{
    unsigned long ulLenOfString = 0, ulLenOfSearch = 0, ulLenOfReplace = 0;
    unsigned long ulLenOfAbs = 0;
    unsigned long ulPos = 0;
    unsigned long i = 0;
    //计算源字符串长度(不允许为空)
    if (NULL == pstrString)    return false;
    while (0 != pstrString[ulLenOfString])
    {
        ulLenOfString++;
    }
    if (0 == ulLenOfString)    return false;
    //计算搜索字符串长度(不允许为空)
    if (NULL == pstrSearch)    return false;
    while (0 != pstrSearch[ulLenOfSearch])
    {
        ulLenOfSearch++;
    }
    if (0 == ulLenOfSearch)    return false;
    //计算替换字符串长度(允许替换成空)
    if (NULL != pstrReplace)
    {
        while (0 != pstrReplace[ulLenOfReplace])
        {
            ulLenOfReplace++;
        }
    }
    //循环查找搜索字符串,并替换成新字符串
    for (ulPos = 0; ulPos < ulLenOfString && ulLenOfString < ulMaximumimum; ulPos++)
    {
        for (i = 0; i < ulLenOfSearch; i++)
        {
            //判断源字符串是否已经到达结尾处
            if (0 == pstrString[ulPos + i])    break;
            //判断源字符串当前字符是否与搜索字符串当前字符相等
            if (pstrString[ulPos + i] != pstrSearch[i])    break;
        }
        //搜索进度对应的是搜索字符串是否匹配.
        if (i != ulLenOfSearch)    continue;
        //找到了搜索字符串,进行替换操作
        //-----判断后续字符串是左移还是右移
        if (ulLenOfReplace <= ulLenOfSearch)
        {//替换字符串长度小于(等于)搜索字符串长度,源字符串的后续内容需要左移(从左向右的顺序进行复制)
         //先复制替换字符串
            for (i = 0; i < ulLenOfReplace; i++)
            {
                pstrString[ulPos++] = pstrReplace[i];
                //直接操作ulPos可以使最上层while()循环跳过新替换的字符串部分,避免A替换成AA时的循环操作.
            }
            //向左移动后续部分(计算新长度)
            ulLenOfAbs = ulLenOfSearch - ulLenOfReplace;
            ulLenOfString = ulLenOfString - ulLenOfAbs;
            for (i = ulPos; i <= ulLenOfString; i++)
            {//i<=ulLenOfString使得最后一个空中止也会被复制,即正确的截断了字符串.
                pstrString[i] = pstrString[i + ulLenOfAbs];
            }
        }else
        {//替换字符串长度大于搜索字符串长度,源字符串的后续内容需要右移(从右向左的顺序进行复制,避免内存重叠问题)
         //向右移动后续部分(计算新长度)
            ulLenOfAbs = ulLenOfReplace - ulLenOfSearch;
            ulLenOfString = ulLenOfString + ulLenOfAbs;
            for (i = ulLenOfString; i > ulPos; i--)
            {//i<=ulLenOfString使得最后一个空中止也会被复制,即正确的截断了字符串.
                pstrString[i] = pstrString[i - ulLenOfAbs];
            }
            //复制替换字符串
            for (i = 0; i < ulLenOfReplace; i++)
            {
                pstrString[ulPos++] = pstrReplace[i];
                //直接操作ulPos可以使最上层while()循环跳过新替换的字符串部分,避免A替换成AA时的循环操作.
            }
        }
    }
    if (ulLenOfString == ulMaximumimum)    return false;
    return true;
}

函数特征是直接在源字符串中进行操作,不需要额外的存储空间,但前提是源字符串所在的内存区域有足够的空间容纳替换后的完整字符串,空间不足会导致源字符串被损坏.
宽字节版本的函数只需要替换函数声明即可,函数主体代码不需要修改.
bool Str_ReplaceW (wchar_t    * pstrString, unsigned long ulMaximumimum, const wchar_t    * pstrSearch, const wchar_t    * pstrReplace)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值