CString::Delete
-
Hallo,
ich habe in einen CString Datensätze gespeichert. Meinen CString enthällt sehr viele unnütige Daten die zwischen "< >" Klamer stehen.
Dazu will ich meinen CString bereinigen.Ich habe versucht mit der Funktion CString::Delete () leider mache ich irgendwas fallsch, kann mir jemand bitte helfen?
Was habe ich falsch bei der Funktion gemacht, und wie kann ich es gut machen ?CString strTextKopi; strTextKopi = m_strText; // initialisiren (public: m_strText) laenge = strTextKopi.GetLength(); // Länge ermitteln laenge = laenge -1; for(laenge; laenge > 0; laenge--) { if (strTextKopi[laenge] == '>') { zu_index = laenge; } if (strTextKopi[laenge] == '<') { auf_index = laenge; index = 1; } if (index == 1) { strTextKopi.Delete(auf_index, zu_index); index = 0; } }
-
der zweite Parameter bei Delete gibt nicht den Endindex an, sondern wie viele Zeichen gelöschz werden sollen ab der angegebenen Stelle.
Tip: schau dir mal CString::Find an, das erspart dir dein Gemehre mit den for-Schleifen
-
Hallo Don_Pazo,
Delete braucht (nach MSDN)
int Delete( int nIndex, int nCount = 1 )
also nicht 2 indexen ins Feld. Es ist klar ?
Folgendes lauft gut:
if (index == 1)
{
strTextKopi.Delete(auf_index, zu_index-auf_index+1);
index = 0;
}Ehm ... hast du debuger versuchen ? :-))
Fredy
(sorry, aber meine deutsche Sprache ist nicht ganz gut).
-
So oder so ähnlich würd ich das denk ich machen
CString strTextKopi; strTextKopi = m_strText; // initialisiren (public: m_strText) int iPosBegin = 0; int iPosEnd; While(true) { iPosBegin = strTextKopi.Find("<",iPosBegin); iPosEnd = strTextKopie.Find(">",iPosEnd); if (iPosBegin != -1 && iPosEnd != -1) { strTextKopi.Delete(iPosBegin,iPosEnd-iPosBgin); } else break; }
wobei mir das while(true) jetzt selbst nicht so gefällt aber dürfte so funktionieren
-
ich würde "iPosEnd-iPosBgin + 1" machen damit das ">" auch weg ist
-
jo grad gelesen und korrigiert
hab mich aber da auch beim schnellen drüberschauen in der MSDN verlesen
shame on me
-
och man und ich les das nochmal und denk ich hab mich verlesen dabei wars schon korrigiert^^
-
-
Hei danke für ausreichende Information, es hat mir geholfen
-
Es gibt aber jetzt etwes was stört.
Wenn man mit CString :: Delete arbeitet wird das CString mit neuen Zeilen nach jedem Delete operation versetzt.
Beispiel:
... <class 'ress'>Sisi</td><class 'ress'>Mimi</td><class 'ress'>Nina</td><class 'ress'>
<class 'ress'>90</td><class 'ress'>60</td><class 'ress'>90</td><class 'ress'>
<class 'ress'>017399</td><class 'ress'>016055</td><class 'ress'>017022</td><class 'ress'>
......
nach dem Delete Operazion siet so aus:Sisi
Mimi
Nina90
60
90017399
016055
017022was ich will ist aber das die Datensätze so sind:
SisiMimiNina
906090
017399016055017022
was ich brauche.
Ich habe es wersucht bei Delete einen zeichen weniger zu löschen und statt ">" einen Backspace zu machen. Das solte das negatiwe Efekt von der Neuezeile kompensieren. Es klapt aber nicht:
strTextKopi.Replace(">", "\b"); // '\b' Backspace
Konnt ihr mir noch bischen helfen?
-
vielleicht:
strTextKopi.Replace("\n", "");
-
Das kommt nicht vom delete. entweder du machst was falsch, dann wäre es von unschätzbarem Vorteil, den betreffenden Quellcode mit zu posten
, oder, was ich eher vermute, dein Ursprungs-String enthält die newLine-zeichen schon. Überprüf das mal
-
void CE_LearnView::StringAendern() { CString strTextKopi; CString strVertig; int index = 0; // laufvariable int laenge = 0; // gesammt Länge von CString int auf_index = 0; // index für "<" (Klameer auf) int zu_index = 0; // index für ">" (Klameer zu) strTextKopi = m_strText; // initialisiren //strVertig = ""; laenge = strTextKopi.GetLength(); // Länge ermitteln laenge = laenge - 1; for(laenge; laenge >= 0; laenge--) { if (strTextKopi[laenge] == '>') { zu_index = laenge + 1; } if (strTextKopi[laenge] == '<') { auf_index = laenge; index = 1; } if (index == 1) { zu_index = zu_index - auf_index; strTextKopi.Delete(auf_index, zu_index); index = 0; zu_index = 0; auf_index = 0; } } strTextKopi.Replace("\n", ""); // ES FUNKTIONIERT LEIDER NICHT m_strText = strTextKopi; MessageBox(strTextKopi); }