2013-06-19 162 views
5

我有一個CString st= $/Abc/cda/($/dba/abc)/。我只想用c:\替換$的第一個匹配項。如何只替換CString中第一次出現的字符?

我曾嘗試更換爲

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

但它取代的$所有發生。

請你給我建議任何邏輯,只取代第一次出現的字符。

+0

這是什麼'替換'?爲什麼它與「R」? – Maroun

+1

@MarounMaroun這是MFC [CString :: Replace](http://msdn.microsoft.com/en-us/library/ztyt5e9c(v = vs.100).aspx),它會替換所有發生的字符串或一個字符 –

+0

@EdwardClements謝謝:) – Maroun

回答

4

既然你是由三個字符替換單個字符,你可以使用CString::Find()然後CString::Delete()CString::Insert(),像

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

謝謝。它工作正常。 :) – user2499879

0

使用

find_first_of //返回迭代器到字符串中第一次出現

然後

replace //更換迭代器,指向第一次出現

+0

if(st.FindOneOf(「$」)== 0) st.Replace(「$」,「c:\」);我已經嘗試過,但它取代了所有的發生。我比較0,因爲我知道特徵的第一次出現。 – user2499879

+0

@ user2499879 if語句沒有幫助。它只是說,如果第一個字符是$,那麼替換所有發生的$ – olevegard

+0

但我只想替換字符的第一個出現。那我爲什麼要替換所有的發生。 – user2499879

0

你可以使用void SetAt(int nIndex, TCHAR ch);來替換一個字符。 然後int FindOneOf(LPCTSTR lpszCharSet) const;找到第一個出現的$。

像這樣:

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

我試過了,但用一些垃圾值替換了$。一些時間來管道符號和一些時間4.我正在使用像st.SetAt(st.FindOneOf(「$」),_TCHAR(「C:/」));. – user2499879

+0

@ user2499879你需要_TCHAR嗎?如果沒有它,那麼嘗試'L「C:/」'或'_T(「C:/」)' – olevegard

+1

'CString :: SetAt()'只接受一個字符,而不是一個字符串! –

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; 
} 
相關問題