String Eingabe richtig stückeln



  • Ich schreibe grade ein Programm um Zahlen per Befehl in eine sortierte Liste einzufügen.
    Sprich man muss Zahlen nach folgendem Format eingeben: "i3i5i7d3d5d7" (i=insert,d=delete)

    und dann wird die Eingabe einzeln in die Liste Schrittfür Schritt eingelesen.

    Funktioniert bisher alles, jedoch nur, wenn ich bei der Eingabe immer ein Leerzeichen zwischen den Befehlen eingebe. "i3 i5 i7" etc, funktionieren soll es aber (und war auch meine Intention, keine Ahnung warum das so reagiert) als einzelner, zusammenhängender Befehl.

    /********Liest die Integerzahl aus dem Eingabestring aus**********/
    int int_auslesen(string eing){
        int ausg = 0;
        eing.erase(0,1);                 //Löscht den Buchstaben "e23" -> "23"
        stringstream convert(eing);
        convert >> ausg;
        if (!eing[0]){ausgabe();}
        return ausg;
    }
    

    Sortiert wird bei der Ausgabe, da jeder Schritt einzeln abgebildet werden soll.

    Falls wem ins Auge fällt, warum dies so ist, bitte drauf Aufmerksam machen 😕

    Edit: comments



  • Hallo bonzei,

    der Code, den Du gepostet hast, hat nichts mit der Trennung der einzelnen 'Befehle' zu tun, wo Du Dein Problem vermutest. Er beseitigt lediglich das erste Zeichen am Anfang und konvertiert den Rest in eine Zahl.

    Ich vermute, Du liest diese Befehle mit einem String von einem std::istream (cin oder ifstream). Dann besteht Dein erster Fehler bereits darin, dass Du überhaupt strings benutzt. Einfacher wäre es Du liest Character ('i' bzw. 'd') und Zahlen und verarbeitest diese gleich. In etwa so:

    #include <algorithm>
    #include <list>
    #include <iostream>
    
    int main()
    {
        using namespace std;
    
        list< int > zahlen;
        bool ende = false;
        for( char cmd; cin >> cmd; )
        {
            int zahl;
            switch( cmd )
            {
            case 'i':   // insert
                if( cin >> zahl )
                    zahlen.push_back( zahl );
                break;
            case 'd':   // delete
                if( cin >> zahl )
                    zahlen.remove( zahl );
                break;
            default:
                ende = true;
                break;
            }
            if( ende )
                break;
            cout << "Liste: ";
            for( auto z: zahlen )
                cout << z << " ";
            cout << endl;
        }
    }
    

    dann ist es auch egal, ob noch Leerzeichen oder Tabulatoren dazwischen stehen oder nicht.

    Gruß
    Werner


Log in to reply