如何在CString中仅替换第一个字符出现的位置?

7

我有一个CString st= $/Abc/cda/($/dba/abc)/。我想仅替换第一次出现的$c:\

我尝试使用以下方法进行替换:

st.Replace("$","c:\");

但它替换了所有的$字符。

是否可以提供一种逻辑,只替换第一个字符呢?


这是什么 Replace? 为什么要用 "R"? - Maroun
1
@MarounMaroun 这是 MFC CString::Replace,它可以替换字符串或字符的所有出现。 - Edward Clements
4个回答

5

由于您要用三个字符替换一个字符,因此可以使用 CString::Find() 然后使用 CString::Delete()CString::Insert(),示例:

int nInx = st.Find('$');
if (nInx >= 0)
{    st.Delete(nInx, 1);
     st.Insert(nInx, _T("C:\\");
}

2

使用

find_first_of // 返回字符串第一次出现的迭代器

然后使用

replace // 用指向第一次出现的迭代器来替换


如果(st.FindOneOf("$") == 0) st.Replace("$","c:"); 我尝试过这样,但它替换了所有出现的字符。我使用0进行比较,因为我知道第一个字符的出现位置。 - user2499879
@if语句没有帮助。它只是说明如果第一个字符是$,则替换所有出现的$。 - olevegard
但是我只想替换第一次出现的字符。那么为什么我要替换所有出现的字符呢? - user2499879

0
如果您只需要将一个字符替换为另一个字符,可以使用SetAtFindFirstOf结合使用。 FindFirstOf将找到要替换的字符的第一次出现的索引。通过将其作为SetAt的第一个参数传递,并将替换字符作为第二个参数传递,您可以将第一个"$"替换为"#":

st.SetAt( st.FindOneOf( "$" ), "#");

然而,对于问题中提到的特定情况,这并不适用,因为您需要将"$"字符替换为多字符字符串。 为此,您需要使用{{link1:Edward Clements's solution}}。


我已经尝试过,但是用一些垃圾值替换了$。有时会出现管道符号,有时会出现4。我正在使用类似这样的代码:st.SetAt(st.FindOneOf("$"), _TCHAR("C:/"));。 - user2499879
@user2499879,你需要使用_TCHAR吗?如果没有它无法正常工作,可以尝试使用L"C:/"_T("C:/") - olevegard
1
CString::SetAt() 接受单个字符,而不是字符串! - Edward Clements
@EdwardClements 啊,我的错。那么你的解决方案更可取。 - olevegard

0
这是一个将Edward Clements所提供的答案进行封装的函数:
int replaceFirstOf(CString& str, const LPCSTR pszOld, const LPCSTR pszNew)
{
    int found = str.Find(pszOld);
    if (found >= 0)
    {
        str.Delete(found, 1);
        str.Insert(found, pszNew);
    }   
    return found;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接