Space löschen ?



  • Hallo Leute 😉 ,

    ich habe folgendes Prob. ich versuche in einem Srting mehrfach vorkommende SpaceZeichen zu löschen.
    Wenn ich hier z.b. eine 1 reinschreibe dann sind steht die 1 genau an den Stellen die gelöscht werden sollen aber was uss ich reinschreiben un die Spaces durch nichts zu ersetzen also sie zu löschen ? 😕

    Hier mal mein Code:

    #include<iostream>
    #include<fstream>
    #include<string>
    
    using namespace std;
    
    int main()
    {
    
    	 ifstream f;
    	 string s;
    
    	 f.open ("test.txt",ios::in);
    
    	 while(!f.eof())
    	 {
    		 getline(f, s);
    		 cout << s << endl;
    	 }
    	 f.close();
    
    	 for (int i = 0 ; i < s.length(); i++)
    	 {
    		 if (s[i] ==' ' && s[i+1] == ' ')
    		 {
    			s[i] = ' ';
    		 }
    	 }
    	 cout << s << endl;
    
    	return 1;
    }
    

    ich les den String zwar aus ner Textdatei ein aber für Testzwecke kann für s irgend ein x-beliebiger Text eingegeben werden !

    Danke für eure Hilfe;);)
    ShadowEater



  • remove() ist gut für sowas.
    (Allerdings verkürzt er einen string nicht, weswegen man abschließend den "Schrott am Ende" mittels string::erase() löschen muss)

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <algorithm>
    
    using namespace std;
    
    int main() {
         ifstream f("test.txt");
         string s;
    
         while(!f.eof())
         {
             getline(f, s);
             cout << s << endl;
         }
         f.close();
    
         s.erase(remove(s.begin(), s.end(), ' '), s.end());
         cout << s << endl;
    
         return 1;
    }
    

    Gruß,

    Simon2.



  • Einzelne Zeichen kannst du mit erase() aus dem String löschen, dann rücken die nachfolgenden Zeichen auch nach vorne und schließen die Lücke.



  • Danke für eure Antworten 😉

    @CStoll mir erase() hab ichs schon versucht aber das hat nicht so geklappt könntest Du auf den Code bezogen etwas konkreter werden, ich weiss nicht was da nicht geklappt hat ???

    mfg
    😉
    SH



  • s.o.



  • Oh mann Simon2 D*A*N*K*E

    bin heute etwas durch den Wind !

    mfg
    SE



  • Gern geschehen !

    Ich hoffe, es funktioniert wie erwartet.
    Allerdings muss ich Dich auch ein wenig in Schutz nehmen: Den Source habe ich erst später reineditiert (allerdings hatte ich da noch nicht CStolls Post auf dem Schirm).

    Gruß,

    Simon2.



  • ;)Hmmm 😉

    'remove' : Funktion akzeptiert keine 3 Parameter !!!

    P.S. ich dachte ich könnte das nur mit erase ohne remove regeln .

    mfg
    SH



  • 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