Spaces in CString löschen



  • Hallo Leute ;),

    ich habe folgendes Prob. ich versuche in einem CSrting mehrfach vorkommende SpaceZeichen zu löschen. D.H. wenn 2 oder mehr aufeinanderfolgen soll immer nur eins stehenbleiben !
    Ich hatt da schonmal in normalem C++. Nun sind in CString natürliche andere Fnkt. als in String. Erase und Uniqe gibbet leider nicht !

    Hier mal mein Code:

    CString gleich;
    	gleich = " ";
    	CEingabeDlg dlgEing;
    	CRichEditCtrl& rCtrl = GetRichEditCtrl();// Pointer auf das RichEditControl erstellen um dessen Funktionen zu nutzen
    	dlgEing.DoModal ();
    
    	for (int i = 0 ; i < dlgEing.m_strEingabe.GetLength(); i++) 
    	{ 
    		if (dlgEing.m_strEingabe[i]==gleich)
    		{
    			dlgEing.m_strEingabe.Remove(' ');
    		}
        } 
    	rCtrl.ReplaceSel(dlgEing.m_strEingabe);	 // Text formaitert auf RTF schreiben
    

    der Code führt natürlich dazu dass alle Spaces zwischen den eingegebenen Zeichen entfernt weden... 😕
    Die MSDN is bei CStrings nur sehr oberflächlich auskunftsbereit 😢

    Könnt Ihr mir sagen wies richtig geht ?

    Vielen Dank für eure Hilfe
    ShadowEater

    P.S.: Ich hab mal gelesen dass es eine Funktion in der StringKlasse geben soll die Strings nach CString castet ???



  • CString txt = "Ein Text mit  mehrfachen   Leerzeichen";
    	int n = 0;
    	while ((n = txt.Find("  "), n) >= 0)
    	{
    		txt.Delete(n);
    	}
    


  • unique() (das hatte ich dir bei der ANSI-Version des Problems empfohlen) kannst du auch auf char-Arrays anwenden (und an das char-Array eines CString kommst du mittels GetBuffer()).



  • w arum so kompliziert?

    MSDN schrieb:

    Removes all instances of the specified character from the string.

    CStringT::Remove
    


  • Pellaeon schrieb:

    w arum so kompliziert?

    Weil ShadowEater nicht ALLE Leerzeichen löschen will, sondern nur mehrfach vorkommende Leerzeichen durch einzelne ersetzen.



  • jencas schrieb:

    CString txt = "Ein Text mit  mehrfachen   Leerzeichen";
    	int n = 0;
    	while ((n = txt.Find("  "), n) >= 0)
    	{
    		txt.Delete(n);
    	}
    

    Wenn ich das so sehe, fällt mir die MFC-Übersetzung ein:

    CString txt = "Ein Text mit  mehrfachen   Leerzeichen";
    	while (-1 < txt.Find("  "))
    	{
    		txt.Replace("  ", " ");
    	}
    


  • Vielen Dank Leute !
    Ich werd jetzt alle Versionen mal ausprobieren !

    ;))
    ShadowEater



  • estartu schrieb:

    Wenn ich das so sehe, fällt mir die MFC-Übersetzung ein:

    ????

    estartu schrieb:

    CString txt = "Ein Text mit  mehrfachen   Leerzeichen";
    	while (-1 < txt.Find("  "))
    	{
    		txt.Replace("  ", " ");
    	}
    

    Performancenachteile:
    a) bei dieser Lösung wird immer wieder vom Anfang des Strings aus nach zwei Leerzeichen gesucht
    b) Replace() statt Delete()



  • jencas schrieb:

    Performancenachteile:
    a) bei dieser Lösung wird immer wieder vom Anfang des Strings aus nach zwei Leerzeichen gesucht
    b) Replace() statt Delete()

    a) Ich hatte nicht behauptet, dass es performant ist und es war auch nur ein "Aufschreiben was beim Lesen des anderen vor dem inneren Auge erschien".
    b) Ich bin der Meinung, Delete funktioniert in meiner Version nicht.

    Klar kann man es noch umbauen...
    ...und ja, das andere war auch MFC, sah nur irgendwie kompliziert aus. 😉



  • Mir ist da grad noch ein Gedanke bezüglich Trennung von Doc und View.
    Es heisst doch das doc hält die Daten !

    Nun habe ich aber das hier:

    void CSDI_DLG_Leerz_entfernenView::OnStreingabe() 
    {    
    	int n = 0; 
    	CString gleich;
    	gleich = "  ";
    
    	CEingabeDlg dlgEing;
    	CRichEditCtrl& rCtrl = GetRichEditCtrl();// Pointer auf das RichEditControl erstellen um dessen Funktionen zu nutzen
    	dlgEing.DoModal ();
    
        while ((n = dlgEing.m_strEingabe.Find(gleich), n) >= 0) 
        { 
           dlgEing.m_strEingabe.Delete(n); 
        }
    	rCtrl.ReplaceSel(dlgEing.m_strEingabe);	 // Text formaitert auf RTF schreiben
    }
    

    ins view gecodet.

    Aber in das dlgEingabe wird der String eingegeben also die Daten.
    Wäre es da nicht richtiger das in das doc zu coden rein prinzipiell 😕
    😕 😕

    Danke
    😉
    ShadowEater



  • estartu schrieb:

    a) Ich hatte nicht behauptet, dass es performant ist und es war auch nur ein "Aufschreiben was beim Lesen des anderen vor dem inneren Auge erschien".

    Aha.

    estartu schrieb:

    b) Ich bin der Meinung, Delete funktioniert in meiner Version nicht.

    Also bei VC6 und VS2005 funzt das einwandfrei. Keine Ahnung, was Du benutzt.... 😕

    estartu schrieb:

    Klar kann man es noch umbauen...
    ...und ja, das andere war auch MFC, sah nur irgendwie kompliziert aus. 😉

    Dann will ich nicht wissen, was Du zum Boost Library Quelltext sagst.... 😉



  • Hi Jencas,

    was meinst Du zu meiner Frage bez. Doc und View ???

    😉
    ShadowEater



  • jencas schrieb:

    estartu schrieb:

    b) Ich bin der Meinung, Delete funktioniert in meiner Version nicht.

    Also bei VC6 und VS2005 funzt das einwandfrei. Keine Ahnung, was Du benutzt.... 😕

    Ich meinte nicht VC-Version. 😃
    Wenn man bei

    CString txt = "Ein Text mit  mehrfachen   Leerzeichen";
        while (-1 < txt.Find("  "))
        {
            txt.Replace("  ", " ");
        }
    

    das

    txt.Replace("  ", " ");
    

    durch

    txt.Delete("  "); // oder " "
    

    ersetzt, dann tut es meiner Meinung nach nicht mehr das, was gewünscht ist. 😉



  • estartu schrieb:

    Wenn man bei

    CString txt = "Ein Text mit  mehrfachen   Leerzeichen";
        while (-1 < txt.Find("  "))
        {
            txt.Replace("  ", " ");
        }
    

    das

    txt.Replace("  ", " ");
    

    durch

    txt.Delete("  "); // oder " "
    

    ersetzt, dann tut es meiner Meinung nach nicht mehr das, was gewünscht ist. 😉

    Was auch völlig klar ist, wenn man sich die Parameterliste von Delete() anschaut -> http://msdn2.microsoft.com/de-de/library/tzzky29w(VS.80).aspx 😮



  • ShadowEater schrieb:

    Mir ist da grad noch ein Gedanke bezüglich Trennung von Doc und View.
    Es heisst doch das doc hält die Daten !

    Nun habe ich aber das hier:

    void CSDI_DLG_Leerz_entfernenView::OnStreingabe() 
    {    
    	int n = 0; 
    	CString gleich;
    	gleich = "  ";
    
    	CEingabeDlg dlgEing;
    	CRichEditCtrl& rCtrl = GetRichEditCtrl();// Pointer auf das RichEditControl erstellen um dessen Funktionen zu nutzen
    	dlgEing.DoModal ();
    
        while ((n = dlgEing.m_strEingabe.Find(gleich), n) >= 0) 
        { 
           dlgEing.m_strEingabe.Delete(n); 
        }
    	rCtrl.ReplaceSel(dlgEing.m_strEingabe);	 // Text formaitert auf RTF schreiben
    }
    

    ins view gecodet.

    Aber in das dlgEingabe wird der String eingegeben also die Daten.
    Wäre es da nicht richtiger das in das doc zu coden rein prinzipiell 😕
    😕 😕

    Danke
    😉
    ShadowEater

    Ich würde das in die Set-Methode einbauen, welche Du aufrufst, um den Eingabewert in das Doc zu packen. Vorausgesetzt natürlich, Du willst/musst den Text leerzeichenbereinigt persistieren. Wenn das Entfernen der Leerzeichen nur für die Optik ist, dann würde ich das im View belassen.


Anmelden zum Antworten