String Zahlen filtern



  • Hallo leute,

    ich habe folgende Frage: Habe ein String welches irgendeine Zeichenkette beinhaltet, möchte nun alle Zahlen in der reihenfolge rausschneiden und als int speichern... Könnt ihr mir da eventuell weiterhelfen oder tipps geben ?

    Beispiel:

    String str : "Hallo3241blieba!"

    ....

    Int Zahlen: "3241"

    Ich bedanke mich schonmal für die vielen Anregungen



  • Müssen die Zahlen alle lückenlos hintereinander stehen?
    Was soll bei "H3allo24blie1ba!" rauskommen?



  • Die Zahlen sollten schon lückenlos stehen!

    Aber diese Zahlen stehen eigentlich immer zusammenhängend! Quasie der fall für H2adsf2sadf45 würde eher unwahrscheinlich auftreten.

    Habe nun was ausprobiert, aber der Ansatz ist glaub schlecht:

    int ch;
    
    ch=std::find_if(str.begin(),str.end(),isdigit()) ; <--- Wobei ich die Fehlermeldung für isdigit erhalte von wegen too few arguments to function
    

    Vielleicht hast du eine bessere Idee für mich ? Wäre echt sehr nett!



  • undercover321 schrieb:

    Habe nun was ausprobiert, aber der Ansatz ist glaub schlecht:

    Nö, der ist schon ganz gut. Allerdings müssen die Klammern bei isdigit weg. Und find_if gibt einen Iterator zurück, keinen int.



  • #include <iostream>
    #include <string>
    #include <locale>
    #include <algorithm>
    
    template<typename Char>
    struct NotDigit
    {
        bool operator()(Char c) const
        {
            return !std::isdigit(c, l);
        }    
        std::locale l;
    };
    
    int main() 
    {
        const std::string in = "Ha3llo3241blieba!";
        std::string out;
        std::remove_copy_if(in.begin(), in.end(), 
            std::back_inserter(out), NotDigit<char>());
    
        int i = atoi(out.c_str());
        std::cout << i;
        return 0;
    }
    

    Statt atoi kann man auch Streams oder boost::lexical_cast verwenden wenn man mag.



  • @MFK mein Prog funktioniert dennoch nicht

    @brotbernd verstehe nicht wofür die string variable out dienen soll ?!?



  • Dort wird das Ergebnis gespeichert. Du kannst auch das erase remove idiom auf den original string anweden:
    http://en.wikipedia.org/wiki/Erase-remove_idiom

    int main() 
    {
        std::string in = "Ha3llo3241blieba!";
        in.erase(std::remove_if(in.begin(), in.end(), NotDigit<char>()), in.end());
    
        int i = atoi(in.c_str());
        std::cout << i;
        std::cin.get();
        return 0;
    }
    


  • undercover321 schrieb:

    @MFK mein Prog funktioniert dennoch nicht

    Dann ist ja alles klar. 🙄



  • Ich habe eine Fehlermeldung die leider sehr ungenau ist?

    und zwar :

    [cpp
    template<typename Char>
    struct NotDigit
    {
    bool operator()(Char c) const
    {
    return !std::isdigit(c, l); //Compiler sagt: at this point
    }
    std::locale l; // Ist das ein L wie ludwig oder eine Ziffer ?
    };

    cpp]



  • undercover321 schrieb:

    Compiler sagt: at this point

    Das ist nicht die ganze Meldung.



  • Ja das ist ein kleines L(udwig). Kopier es doch einfach! Und inkludiere alle header.
    Und nochmal mit streams statt atoi

    #include <iostream>
    #include <string>
    #include <locale>
    #include <algorithm>
    #include <sstream>
    #include <iterator>
    
    template<typename Char>
    struct NotDigit
    {
        bool operator()(Char c) const
        {
            return !std::isdigit(c, l);
        }    
        std::locale l;
    };
    
    int main() 
    {
        std::string in = "Ha234blbi7eba!";
        std::stringstream out;
        std::remove_copy_if(in.begin(), in.end(),
            std::ostream_iterator<char>(out), NotDigit<char>());
    
        int i = 0;
        if (out >> i)
            std::cout << i;    
        else
            std::cout << "Das hat nicht geklappt.";
    
        return 0;
    }
    


  • also der Compiler nörgelt und sagt mir genau das:
    Multiple markers ath this line: -at this point in file

    ist das die Felhermeldung ?!



  • @brotbernd: Also mit dem anderen Code funktioniert es jetzt 👍 Vielen herzlichen Dank! Was ist der unterschied ob ich nun atoi oder sstream verwende ?!?



  • Ich kann dass nicht ganz glauben, dass undercover321 aus einem String wie "Ha234blbi7eba!" die Zahl 2347 lesen möchte, wenn ja - wo kommen dann derartige Zeichenfolgen her?

    Falls Du an den Zahlen 234 und 7 aus dem String interessiert bist, so würde ich Dir einen sogenannten Manipulator empfehlen, der alles überliest, was keine Ziffer ist.

    #include <iostream>
    #include <sstream>
    #include <locale>
    
    std::istream& skipnodigit( std::istream& in ) // ueberliest alles, was keine Ziffer ist
    {
        std::istream::sentry ok( in );
        if( ok )
        {
            const std::ctype< char >& ctype_ = std::use_facet< std::ctype< char > >( in.getloc() );
            for( std::istream::int_type m = in.rdbuf()->sgetc(); ; m = in.rdbuf()->snextc() )
            {
                typedef std::istream::traits_type Traits;
                if( Traits::eq_int_type( m, Traits::eof() ) )
                {
                    in.setstate( std::ios_base::eofbit );
                    break;
                }
                if( ctype_.is( std::ctype_base::digit, Traits::to_char_type( m ) ) )
                    break;
            }
        }
        return in;
    }
    
    int main()
    {
        using namespace std;
        istringstream buf("Ha234blbi7eba!");
        for( int zahl; buf >> skipnodigit >> zahl; )
            cout << zahl << endl;
    
        return 0;
    }
    

    Die Ausgabe ist bei diesem Programm

    234
    7
    

    :xmas2: Werner



  • atoi ist eine Funktion aus der C Standardbibliothek ( #include <cstdlib> fehlte da eigentlich noch). Wenn sie fehl schlägt, gibt sie einfach 0 zurück. Der C++ Weg für solche Konvertierungen sind eigentlich eher die streams. Gekapselt in einem praktischen Funktionstemplate gibt es das in boost::lexical_cast .



  • Werner Salomon schrieb:

    :xmas2: Werner

    auch sehr schön 👍



  • Ich danke euch recht herzlich für so einen Support! Ihr habt mir schon mehr als genüge getan und es funktioniert alles Prima....

    Seit alle echt SUPER!!! Großes lob 👍 👍


Anmelden zum Antworten