2013-06-19 11 views
5

Mam CString st= $/Abc/cda/($/dba/abc)/. Chcę zastąpić tylko pierwsze wystąpienie $ z c:\.Jak zamienić tylko pierwsze wystąpienie znaku w CString?

Próbowałem wymienić

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

Ale to zastąpić wszystkie wystąpienia $.

Czy możesz zasugerować mi jakąkolwiek logikę, aby zastąpić tylko pierwsze wystąpienie postaci.

+0

Co to jest "Zamień"? Dlaczego to jest z "R"? – Maroun

+1

@MarounMaroun To jest MFC [CString :: Replace] (http://msdn.microsoft.com/en-us/library/ztyt5e9c (v = vs.100) .aspx), zastąpi wszystkie wystąpienia ciągu lub postać –

+0

@EdwardClements Dzięki :) – Maroun

Odpowiedz

4

Od wymieniasz jeden znak po trzech znaków, można użyć CString::Find() a następnie CString::Delete() i CString::Insert(), jak

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

Dzięki. działa dobrze. :) – user2499879

0

Zastosowanie

find_first_of // zwraca iterator do pierwszego wystąpieniu sznurka

a następnie

replace // zastąpić iterator wskazujący na pierwszym wystąpieniu

+0

if (st.FindOneOf ("$") == 0) st.Replace ("$", "c: \"); Próbowałem tak, ale zastąpiono wszystkie występowanie. Porównywałem to z 0, ponieważ znam pierwsze wystąpienie charatera. – user2499879

+0

@ user2499879 Instrukcja if nie pomaga. Po prostu stwierdza, że ​​jeśli pierwszą postacią jest $, zastąp wszystkie wystąpienia $ – olevegard

+0

, ale chcę tylko zastąpić pierwsze pojawienie się postaci. To dlaczego zastępuję wszystkie występy. – user2499879

0

Można użyć void SetAt(int nIndex, TCHAR ch);, aby zastąpić tylko jeden znak. A następnie int FindOneOf(LPCTSTR lpszCharSet) const;, aby znaleźć pierwsze wystąpienie $.

Jak to:

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

Próbowałem, ale zastąpiłem $ z pewną wartością śmieci. jakiś czas przyszedł symbol rury i jakiś czas 4. Używam jak ten st.SetAt (st.FindOneOf ("$"), _TCHAR ("C: /")). – user2499879

+0

@ user2499879 Czy potrzebujesz _TCHAR? Jeśli nie działa bez niego, spróbuj 'L" C:/"' lub '_T (" C:/")' – olevegard

+1

'CString :: SetAt()' przyjmuje pojedynczy znak, a nie ciąg znaków! –

0

Oto funkcja, która obudowuje przyjęta odpowiedź od 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; 
} 
Powiązane problemy