Probleme mit erase aus der stl



  • Hallo Forum.

    Ich versuche gerade aus einem std::string alle Leerzeichen zulöschen. Dafür habe ich in einem anderen Forum das hier gefunden:

    str.erase(std::remove_if(str.begin(),str.end(), &::isspace),str.end());
    

    allerdings schneidet er es mir dabei immer auf die Länge 1 runter, egal wie lang der string war. Beispiel:

    std::string str;
    str = "a a a a a";
    str.erase(std::remove_if(str.begin(),str.end(), &::isspace),str.end());
    std::cout << str << str.length() << std::endl;
    

    die ausgabe darauf ist dann
    Output:
    a1
    a1
    a1
    a1
    a1

    Ich kappier das nicht es müsste doch eigentlich gehn?



  • Kann ich nicht nachvollziehen:

    #include <iostream>
    #include <string>
    #include <algorithm>
    
    int main()
    {
       std::string str;
       str = "a a a a a";
       str.erase(std::remove_if(str.begin(),str.end(), &::isspace),str.end());
       std::cout << str << str.length() << std::endl;
    }
    

    Ausgabe: aaaaa5
    Du machst da offensichtlich etwas anderes.


  • Mod

    luggas schrieb:

    Ich kappier das nicht es müsste doch eigentlich gehn?

    Da hast du recht, das sollte eigentlich gehen:
    https://ideone.com/cNXHBG

    Folgerung: Das ist gar nicht dein Quellcode. Überprüfe nochmal, ob du dein Programm nach eventuellen Änderungen auch wirklich neu erstellt hast. Falls dies nicht das Problem war, lies dir den dritten Link in meiner Signatur durch.



  • naja mein code sieht schon etwas anders aus

    #include "grammar.h"
    
    int main(void)
    {
       std::string in;
       while(in != "quit")
       {
         cin >> in;
         in.erase(std::remove_if(in.begin(),in.end(), &::isspace),in.end());
         std::cout << in<< in.length() << std::endl;
    
       }
       return 0;
    }
    

    @SeppJ ich wollte euch nur nicht mit sinnlosem Code überlasten 🙂


  • Mod

    luggas schrieb:

    @SeppJ ich wollte euch nur nicht mit sinnlosem Code überlasten 🙂

    Hättest du mal. Deine Zeile 8 macht nämlich ganz was anderes, als du denkst. Lass dir den String mal vor dem erase-remove ausgeben! Danach liest du dir folgendes aufmerksam durch:
    http://www.cplusplus.com/reference/string/basic_string/operator>>/
    http://www.cplusplus.com/reference/string/basic_string/getline/



  • ach verdammt es ist immer irgendwas total einfaches 😃

    das cin versteht kein whitespace

    die lösung ist getline()

    danke SeppJ



  • Schreibe Sie:

    template <typename Predicate>
    istream& getline_filtered(istream& in, string& s, Predicate p, char delim = '\n');
    

    Effects: getline(in, s, delim); s.erase(remove_if(s.begin(),s.end(),p),in.end()); return in;
    Note: Es ist angedacht, dass diese Funktion den Input filtert, bevor er in s eingefügt wird.


Anmelden zum Antworten