Eingabe mit der bestimmte Typen wie "float" u. "string" verhindert werden



  • Kann ich irgendwie ein "cin" so verwenden, da wenn ich was anderes außer "int" eingebe ein Error kommt, und die Eingabe wiederholt werden muss, also sowas:

    cout << ">>";
            while(!(std::cin >> choice) || (choice>2147483647) || (choice<(-2147483648)))
            {
                cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n');
                cout << "ERROR <misentry>\n";
                cout << ">>";
            }
    

    Nur ist hier das Problem, das
    **1.**Eine Fehlermeldung kommt und zwar:

    this decimal constant is unsigned only in ISO C90 [in der Zeile die mit while beginnt]

    2.

    kann ich irgendwie nur noch "-" Zahlen eingeben, weil bei "+" Zahlen kommt n Error.

    Also, da muss es doch irgendwie einen besseren Ansatz geben?
    Wer weiß was?

    MfG
    Stromberg



  • Machs einfach so:

    int zahl;
    while( !(std::cin >> zahl))
    {
      std::cout << "Ungueltige Eingabe, bitte wiederholen.\n";
      std::cin.clear();
      std::cin.ignore( std::numeric_limits< std::streamsize >::max(), '\n' );
    }
    

    Wenn du sicherstellen möchtest, dass der Benutzer nur eine x stellige Zahl eingibt, dann würde ich das Ganze mit getline() einlesen und mit einem regexp validieren.
    Alternativ, bei Zahlen, nimm einen größeren Typ als du eigentlich brauchst für die Eingabe und prüfe dann ob die Größe im Rahmen liegt.



  • lolz schrieb:

    Wenn du sicherstellen möchtest, dass der Benutzer nur eine x stellige Zahl eingibt, dann würde ich das Ganze mit getline() einlesen und mit einem regexp validieren.
    Alternativ, bei Zahlen, nimm einen größeren Typ als du eigentlich brauchst für die Eingabe und prüfe dann ob die Größe im Rahmen liegt.

    Warum so fürchterlich kompliziert?

    Für n-stellige Zahlen gilt |n| < 10^n, und zu große Zahlen werden vom Stream sowieso schon abgefangen (geht auch kaum anders).



  • finix schrieb:

    lolz schrieb:

    Wenn du sicherstellen möchtest, dass der Benutzer nur eine x stellige Zahl eingibt, dann würde ich das Ganze mit getline() einlesen und mit einem regexp validieren.
    Alternativ, bei Zahlen, nimm einen größeren Typ als du eigentlich brauchst für die Eingabe und prüfe dann ob die Größe im Rahmen liegt.

    Warum so fürchterlich kompliziert?

    Für n-stellige Zahlen gilt |n| < 10^n, und zu große Zahlen werden vom Stream sowieso schon abgefangen (geht auch kaum anders).

    Du prüfst etwas anderes als ich vorgeschlagen habe.

    Mein letzterer Test tut nichts anderes als dein Test und beide garantieren nur, dass das Programm einen Wert bekommt der im Rahmen liegt, nicht dass die Eingabe des Benutzers im Rahmen liegt.


Anmelden zum Antworten