Datentyp vergleich - möglich oder nicht?



  • Hallo,

    habe ein Programm geschrieben welches ein Menü beinhaltet.Jedes einzelne Menü wird über eine Zahl ausgewählt(Integer-Wert).Nun habe ich das Problem wenn ich einen Buchstaben mir das Programm(in einer Endlosschleife)meine eingebaute Fehlermeldung ausgibt.Nunj meine Frage: Gibt es soetwas wie einen Datentypenvergleich?Also z.B.

    //Pseudo
    
    if (auswahl != int)
            {
              cout << "Geb doch kein Buchstaben ein ;-)";
            }
    

    Wenn jemand Tipps für mich hat wäre ich dankbar 🙂



  • if (typeid(auswahl) != typeid(int)) 
            { 
            cout << "Geb doch kein Buchstaben ein ;-)"; 
            }
    

    wäre ein Datentypvergleich, aber ich versteh deine Beschreibung der Anwendung nicht so ganz



  • wenn das einlesen als integer fehlschlägt, dann setzt dein eingabestream sein failbit (idR). d.h. mit einer abfrage à la

    int input;
    if (cin >> input)
    {
       //... hat geklappt!
    }
    

    wirst du zufrieden sein. die "falschen" daten bleiben aber dann im stream. du kannst sie dann entweder ignorieren oder als string auslesen und dem benutzer sagen, dass die eingabe böse war, auf jeden fall musst du aber das failbit zurücksetzen.

    else
    { 
       cin.clear();
       string tmp;
       cin >> tmp;
       cout << "Fehler: \"" << tmp << "\" - Eingabe ist wirr.\n";
    }
    


  • So z.B.:

    int eingabe;
    if( !(std::cin >> eingabe) )
    {
        std::cout << "Bitte nur Zahlen!\n";
        //Fehlerstati zuruecksetzen
        std::cin.clear();
        //Fehlerhafte Zeichen im Stream ueberspringen
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    
    }
    

    PS: (cin >> Typ) Gibt false zurück, wenn der Input nicht in den passenden Typen konvertiert werden kann.



  • stack schrieb:

    Nunj meine Frage: Gibt es soetwas wie einen Datentypenvergleich?

    Auch wenn es nicht das ist was dein Problem darstellt:

    Stichwort: RTTI
    Da C++ aber Typsicher ist funktioniert dies aber nur in Zusammenhang mit Polymorphie.

    Dein Problem solltest du durch überprüfen des Eingabestreams lösen können. Wenn du über cin eine int-Variable füllst bleibt die auch int wenn du einen Text eingibst. Aber der cin-Stream wird ungültig...

    cu André



  • Du weisst doch, welchen Datentyp das hat, worin Du einliest. Wenn nach dem >> eine int-Variable steht, ist das eben int.

    Was Du möchtest, ist vermutlich das Ergebnis von cin >> variable zu überprüfen. Wenn das false liefert, kannst Du den Fehlerstatus zurücksetzen, den Eingabepuffer leeren und es nochmal versuchen. In etwa so:

    int i;
    while (!(cin >> i)) {
        cout << "Das war kein int!" << endl;
        cin.clear();
        cin.ignore(10000, '\n');
    }
    cout << "DAS war ein int: " << i << endl;
    

    Nur der Vollständigkeit (ich möchte niemanden überfordern): Die 10000 im ignore-Aufruf sagt aus "ignoriere bis zu 10000 Zeichen oder bis Du \n gelesen hast". Der Wert könnte (sollte) auch eine größere Zahl sein, z.B. das Maximum std::numeric_limits<streamsize>::max().



  • Danke für die Hilfe!

    Hab die Variante von LordJaxom genommen und klappt gut!


Anmelden zum Antworten