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
    Nina

    90
    60
    90

    017399
    016055
    017022

    was 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);
    
    }
    

Anmelden zum Antworten