Space löschen ?



  • Du kannst auch erase() die Position übergeben, die es löschen soll:

    if(s[i]==' ') s.erase(i);
    

    (aber daß remove() keine drei Parameter akzeptieren sollte, halte ich für ein Gerücht - hast du auch alle benötigten Header eingetragen?)

    PS: Wenn es dir darum geht, mehrfach vorkommende Leerzeichen zu kürzen, könnte auch unique() die richtige Lösung sein:

    bool both_space(char c1,char c2)
    { return c1==' ' && c2==' '; }
    
    ...
    s.erase(unique(s.begin(),s.end(),both_space),s.end());
    


  • Hi,

    remove() erledigt für Dich das FINDEN der Positionen (und das "Aufrücken" der nachfolgenden Zeichen - das würde erase() aber auch machen).

    hmmm also bei mir (gcc) funktioniert der Code tadellos ...

    Gruß,

    Simon2.



  • @CStoll
    Also mein Code sieht jetzt so aus :

    #include<iostream>
    #include<fstream>
    #include<string>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
    
    	 ifstream f;
    	 string s;
    
    	 s ="test    string  Trallala    Hoppsasa";
    
         for (int i = 0 ; i < s.length(); i++) 
         { 
    		 if(s[i]==' ') s.erase(i);
         } 
         cout << s << endl;
    	return 1;
    }
    

    Das Einlesegedöns hab ich weggelassen, es geht ja nur um den String !
    Es wird aber nur noch test ausgegeben der Resr fehlt !?? Aber diese Version von Dir finde ich am besten !;)

    @Simaon2
    Ich guch nochmal im Studio !

    mfg
    SH



  • Schau Dir mal die verschiedenen Overloads von erase() an:

    iterator erase( iterator loc );
      iterator erase( iterator start, iterator end );
      string& erase( size_type index = 0, size_type num = npos );
    

    Dann kommst Du vielleicht drauf, welches bei Deinem Code aufgerufen wird.... 😃

    Gruß,

    Simon2.



  • @Simon2
    http://www.cppreference.com/cppstring/erase.html
    Die 2. Version, da ab dem ersten Auftreten eines Spaces ab i alles gelöscht wir !

    Aber ich will doch nur die Spaces löschen die zu viel sind *heul*
    Sry aber ich steh total aufm Schlauch 😞 !

    mfg
    SH



  • ShadowEater schrieb:

    @Simon2
    http://www.cppreference.com/cppstring/erase.html
    Die 2. Version, da ab dem ersten Auftreten eines Spaces ab i alles gelöscht wir !

    Nicht ganz - da i ein int-Wert ist, wird die dritte Version aufgerufen (und 'npos' steht in diesem Fall für "von hier bis zum Stringende").

    PS: Wie ich vorhin schon sagte - wirf mal einen Blick auf unique()



  • ShadowEater schrieb:

    ...
    Die 2. Version, da ab dem ersten Auftreten eines Spaces ab i alles gelöscht wir !...

    Ich hatte nicht gefragt, welche Du aufrufen möchtest, sondern welche aufgerufen wird ! ... und das ist offensichtlich nicht die zweite (wie schon ein Durchzählen der übergebenen Parameter ergeben dürfte) 😉

    Gruß,

    Simon2.

    P.S.: Wie ich bereits sagte: Wirf mal einen Blick auf remove().



  • @Simon2

    Gut ich benutze Deine Lösung mit remove, funktioniert jetzt auch, nachdem ich alles in ein neues Projekt kopiert habe 😉
    Aber es werden alle Spaces entfernt 😢 nicht die die zuviel sind, es soll zwischen jedem Wort ein Space bleiben 😉

    Danke für Deine Hilfe
    Morgen brauch ich Urlaub
    😉
    SH



  • Ja, da ist remove() radikal - für solche Anwendungen ist die unique()-Lösung besser geeignet (unique() löscht immer, wenn zwei aufeinanderfolgende Elemente "gleich"* sind, eins davon aus der Sequenz - das heißt, von einer beliebig langen Folge Leerzeichen überlebt am Ende genau eins).

    * was "gleich" ist, bestimmt die übergebene Vergleichsfunktion - die obengenannte 'both_space()' liefert nur dann true, wenn beide Zeichen Leerzeichen sind



  • @CStoll
    Du hast recht unique ist das Beste, wenn ich das gante ohne Deine F boo Both_Space regeln möchte, kann ich das Zeichen das gleich sein soll direkt übergeben ?

    #include<iostream>
    #include<fstream>
    #include<string>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
    
    	 ifstream f;
    	 string s;
    
         s ="test    string  Trallala    Hoppsasa";
    
         for (int i = 0 ; i < s.length(); i++) 
         { 
    
             if (s[i] ==' ' && s[i-1] == ' ') 
             { 
    		s.erase(unique(s.begin(),s.end(),' '),s.end());
             } 
         } 
         cout << s << endl;
    	return 1;
    }
    

    Jetzt meckert er aber :

    Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'char *__cdecl std::adjacent_find(char *,char *,char)'

    Was mach ich nur falsch ???

    mfg
    SE



  • Nein, kannst du leider nicht - unique() erwartet als dritten Parameter eine Funktion, die ihm sagt, ob zwei gegebene Werte "gleich" sind. (btw, wenn du den dritten Parameter weglässt, nutzt es op== als Vergleichsfunktion - das würde auch das zweite l aus 'Trallala' entfernen)

    PS: Übrigens ist die echte Fehlermeldung wohl etwas weiter oben 😉



  • @CStoll

    DANKE, DANKE, DANKE 😉

    Ich schalt jetzt meinen Rechner ab, freu mich dasses klappt und heul dass ich nicht selbst drauf gekommen bin 😞 🤡 🙄 !

    Oh Mann D*A*N*K*E

    😉
    SE


Anmelden zum Antworten