string的字符串替换函数,类似于CString的Replace

本文详细探讨了在标准C++中实现字符串替换功能的多种方法,并针对Unicode编码下的多字节字符串替换进行了深入分析,提供了具体的实现代码及解决特殊字符替换问题的方案。
部署运行你感兴趣的模型镜像
标准C++中的string中的函数不多,没有CString的功能强大,但是如果想在Unicode编码下使用多字节,就不能使用CString,于是自己写了一个类似于CString的Replace函数。
string replace( const string& inStr, const char* pSrc, const char* pReplace )
{
     string str = inStr;
    string::size_type stStart = 0;
    string::iterator iter = str.begin();
    while( iter != str.end() )
    {
        // 从指定位置 查找下一个要替换的字符串的起始位置。
        string::size_type st = str.find( pSrc, stStart );
        if ( st == str.npos )
        {
            break;
        }
        iter = iter + st - stStart;
        // 将目标字符串全部替换。
        str.replace( iter, iter + strlen( pSrc ), pReplace );
        iter = iter + strlen( pReplace );
        // 替换的字符串下一个字符的位置
        stStart = st + strlen( pReplace );
    }
    return str;
}

上述方法在执行replace( "h h h h h h h h h h h h h h h h h h h ", " ", "  " )时出现问题。
下面再列出一种方法:
string CComFunc::replace( const string& inStr, const char* pSrc, const char* pReplace )
{
    string strSrc = inStr;
    string::size_type pos=0;      
    string::size_type srclen = strlen( pSrc );       
    string::size_type dstlen = strlen( pReplace );       
    while( (pos=strSrc.find(pSrc, pos)) != string::npos)
    {               
        strSrc.replace(pos, srclen, pReplace);               
        pos += dstlen;       
    }
    return strSrc;
}

补充,经过测试,上面方法再执行,replace( “暴”, "//","==" )时,依然会遇到问题。
在日文系统上,因为“暴”占两个字节,而"//"只占一个字节,但与“暴”的低位字节ASCII码相同。
而string的Find函数,是按照字节比较的,所以,将这个字节替换了,导致文本替换出现问题。
于是考虑到不应该按字节比较,应该按字符比较,测试发现,CString的替换函数没有问题,于是考虑按照CString的方法重新写一个replace函数。
代码如下:
因为CString在_MBCS和_UNICODE下是变宽的,而我写的replace函数,只针对string。
string CComFunc::replace( const string& inStr, const char* pSrc, const char* pReplace )
{
    string strSrc = inStr;
    LPSTR lpch = ( CHAR* )strSrc.c_str();
    int   nOldLength = strlen( lpch );
    int      nSourceLen = strlen(pSrc);
    if (nSourceLen == 0)
    {
        return lpch;
    }
    int   nReplacementLen = strlen(pReplace);
    LPSTR lpszStart = lpch;
    LPSTR lpszEnd = lpszStart + nOldLength;
    LPSTR lpszTarget;

    // 先列出判断替换字符是否存在的方法, 但在此函数中不使用这段代码。
    /*  
    // judge whether exist
    while (lpszStart < lpszEnd)
    {
        while ((lpszTarget = (CHAR*)_mbsstr(( const unsigned char * )lpszStart, ( const unsigned char * )pSrc)) != NULL)
        {
            nCount++;
            lpszStart = lpszTarget + nSourceLen;
        }
        lpszStart += strStart.length() + 1;
    }
    *//
   
    // 下面是替换的代码。
    while (lpszStart < lpszEnd)
    {
        while ((lpszTarget = (CHAR*)_mbsstr(( const unsigned char * )lpszStart, ( const unsigned char * )pSrc)) != NULL)
        {
            int nBalance = nOldLength - (lpszTarget - lpch + nSourceLen);
            memmove(lpszTarget + nReplacementLen, lpszTarget + nSourceLen,
                nBalance * sizeof(CHAR));
            memcpy(lpszTarget, pReplace, nReplacementLen*sizeof(CHAR));
            lpszStart = lpszTarget + nReplacementLen;
            lpszStart[nBalance] = '/0';
            nOldLength += (nReplacementLen - nSourceLen);
        }
        lpszStart += strlen(lpszStart) + 1;
    }
    return lpch;
}

 此方法最关键的是_mbsstr函数,在"MBSTRING.H"头文件中声明。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>根据用户提供的引用问题,用户想确认C++字符串replace函数所在的头文件。 引用[2]中明确提到:包含头文件<string>,并且给出了字符串的定义与初始化示例。 引用[3]也提到:std::string类提供了replace()等成员函数,位于<string>头文件中。 因此,可以确定C++字符串replace函数是std::string类的成员函数,位于<string>头文件中。 回答用户问题:是的,C++字符串replace函数位于<string>头文件中。 同时,为了帮助用户更好地理解,可以简要说明如何包含该头文件,并给出一个简单的示例。 注意:用户之前的问题是关于replace函数的详细用法,现在只是确认头文件,所以回答要简洁准确。</think>是的,C++ 字符串的 `replace` 函数确实位于 **`<string>`** 头文件中。这是 C++ 标准库中专门用于字符串操作的头部文件,包含 `std::string` 类及其成员函数的所有定义。 ### 关键说明 1. **头文件包含**: ```cpp #include <string> // 必须包含此头文件才能使用 replace using namespace std; // 或使用 std::string ``` 2. **类成员函数**: `replace` 是 `std::string` 类的**成员函数**,因此只能通过字符串对象调用: ```cpp string s = "Hello"; s.replace(1, 3, "123"); // 正确用法 ``` ### 验证示例 ```cpp #include <iostream> #include <string> // replace 函数在此头文件中定义 int main() { std::string s = "C++ is hard"; // 定位并替换 size_t pos = s.find("hard"); if (pos != std::string::npos) { s.replace(pos, 4, "easy"); // 替换子串 } std::cout << s; // 输出: C++ is easy return 0; } ``` ### 补充说明 - **其他字符串函数**:`<string>` 头文件还包含 `find()`、`substr()`、`size()` 等常用字符串操作函数[^2][^3]。 - **C 风格字符串**:若需操作 C 风格字符串(如 `char*`),需包含 `<cstring>` 头文件,但 `replace` 函数不在此头文件中。 > 📌 **最佳实践**:在 C++ 中操作字符串时,始终优先使用 `std::string` `<string>` 头文件,而非 C 风格的字符串函数,因其更安全且功能更强大[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值