【问题标题】:How to replace only first occurrence of character in CString?如何仅替换 CString 中第一次出现的字符?
【发布时间】:2013-06-15 14:10:09
【问题描述】:

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

我尝试替换为

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

但它取代了所有出现的$

您能否建议我使用任何逻辑来仅替换第一次出现的字符。

【问题讨论】:

  • 这是什么Replace?为什么是“R”?
  • @MarounMaroun 这是 MFC CString::Replace,它将替换所有出现的字符串或字符
  • @EdwardClements 谢谢 :)

标签: c++ visual-c++ stl mfc


【解决方案1】:

使用

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

然后

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

【讨论】:

  • if(st.FindOneOf("$") == 0) st.Replace("$","c:\");我试过这样,但它取代了所有的发生。我与 0 比较,因为我知道字符的第一次出现。
  • @user2499879 if 语句没有帮助。它只是说明如果第一个字符是 $,则替换所有出现的 $
  • 但我只想替换第一次出现的字符。那我为什么要替换所有的出现。
【解决方案2】:

您可以使用void SetAt( int nIndex, TCHAR ch ); 仅替换一个字符。 然后int FindOneOf( LPCTSTR lpszCharSet ) const; 找到第一次出现的$。

像这样:

st.SetAt( st.FindOneOf( "$" ), "C:/");

【讨论】:

  • 我试过但用一些垃圾值替换了 $。有时是管道符号,有时是 4. 我正在使用 st.SetAt( st.FindOneOf( "$" ), _TCHAR("C:/"));.
  • @user2499879 你需要 _TCHAR 吗?如果没有它不起作用,请尝试L"C:/"_T("C:/")
  • CString::SetAt() 接受单个字符,而不是字符串!
  • @EdwardClements 啊,我的错。那么您的解决方案更可取。
【解决方案3】:

由于要将单个字符替换为三个字符,因此可以使用CString::Find(),然后使用CString::Delete()CString::Insert(),例如

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

【讨论】:

    【解决方案4】:

    这是一个封装了 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-25
      • 2016-09-08
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      相关资源
      最近更新 更多