Zeichen von Strings entfernen



  • Abend zusammen

    Mein Ziel ist es aus einem c++ string alle Buchstaben und Zeichen zu entfernen. Dadurch kann ich den string in ein int umwandeln.

    Habe schon gesucht und nichts gefunden. Meine Idee: Man könnte mit einer Schleife und string.replace die ASCII Tabelle durchlaufen lassen und jedes Zeichen durch '' ersetzen? Nur weiss ich nicht genau wie man das Funktionstüchtig umsetzt.

    Wie würdet ihr das Problem lösen?

    Gruss



  • was ist mit solchen ketten?

    "zz55aa33aa1-"



  • Solche Ketten werden nicht vorkommen 😉

    In meinen strings steht sowas wie: 100 kW oder 20000 km
    Leider war ich zu Faul die Zahlen von den Masseinheiten zu trennen 🙄 Und jetzt hab ich keine Lust mehr alles umzuschreiben 😃



  • also soweit ich weiss ignoriert atof und atoi die zeichen ausser den zahlen...

    aber du könntest substrings oder erase benutzen

    string str = "23535 km";
    string s1, s2;
    
    s1 = str.substr(0, 5);
    s2 = str; 
    for(int i = 0; i < s2.length(); ++i)
       if ( s2[i] == 'a' || s2[i] == 'b' ... || s2[i] == zeichen )  // hier kann man gut eine funktions chreiben
           s2.erase(i);
    

    das sind 2möglichkeiten

    die zweite musst du antürlich nochr ichtig schreiben



  • std::stringstream bla("100km");
    int zahl;
    bla>>zahl;
    std::cout<<zahl;
    


  • Alle Zeichen eines Strings haben einen Integer-ASCII-Wert. Programmiere eine Schleife und ingnoriere alles, was keine Ziffer ist.



  • s.erase( remove_if( s.begin(), s.end(), not1( pointer_to_unary_function<int, int>( isdigit ) ) ), s.end() );
    


  • MFK schrieb:

    s.erase( remove_if( s.begin(), s.end(), not1( pointer_to_unary_function<int, int>( isdigit ) ) ), s.end() );
    

    Es scheint in letzter Zeit Mode geworden zu sein, möglichst viele STL-Funktionen in eine Zeile Code zu packen 😉



  • kann gut sein

    ich hab noch nicht viel mit der STL zu tun gehabt und kann dmait kaum was anfangen



  • Nexus schrieb:

    Es scheint in letzter Zeit Mode geworden zu sein, möglichst viele STL-Funktionen in eine Zeile Code zu packen 😉

    Ja, das wird leider schnell unübersichtlich.

    Wichtig ist eigentlich nur

    remove_if not1 isdigit
    

    Das hingegen ist schon fast wieder Klartext 😉

    Erase braucht man nur, weil remove(_if) nicht wirklich etwas entfernt, und pointer_to_unary_function brauchte ich, weil not1 nur mit unären Funktionsobjekten arbeiten kann, nicht mit Funktionszeigern. Möglicherweise lässt sich das im neuen Standard viel einfacher schreiben.


  • Administrator

    Es gäbe noch eine kleine Möglichkeit, die Sache zu vereinfachen:

    /* ... */ pointer_to_unary_function<int, int>( isdigit ) /* ... */
    
    // Dieses DING könnte man ersetzen durch:
    
    /* ... */ ptr_fun(&isdigit) /* ... */
    

    So ist es etwas kompakter 🙂

    Und wenn man die Sache vielleicht auch noch auseinander schreibt, dann kann man es sogar anfangen zu lesen.

    #include <cctype>
    #include <string>
    #include <algorithm>
    #include <functional>
    
    // ...
    
    std::string::iterator endOfRange =
      std::remove_if(str.begin(), str.end(),
                     std::not1(std::ptr_fun(&isdigit)));
    
    str.erase(endOfRange, str.end());
    

    Und wie denkst du, dass im neuen Standard das einfacher gehen wird? Über Lambda-Ausdrücke?

    std::string::iterator endOfRange =
      std::remove_if(str.begin(), str.end(),
                     [](char c) -> bool { return !isdigit(c); } );
    

    Naja, derzeit geht es aber wohl am einfachsten mit boost:

    #include <string>
    #include <boost/algorithm/string_regex.hpp>
    
    // ...
    
    std::string str; // Der String
    boost::algorithm::erase_all_regex(str, boost::regex("\\D+"));
    

    Und für das eigentlich Problem, wo es nur darum ging, die Buchstaben am Ende wegzunehmen, wurde auch schon eine einfachere Lösung gezeigt 🙂
    Ansonsten hier vielleicht noch eine weiter:

    std::string str;
    str.erase(str.find_first_not_of("0123456789"));
    

    Oder noch eine mit Boost:

    #include <string>
    #include <boost/algorithm/string.hpp>
    
    // ...
    
    std::string str;
    boost::algorithm::trim_right_if(str, !boost::algorithm::is_digit());
    

    Grüssli


Anmelden zum Antworten