String Zahlen filtern



  • 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