Probleme mit dem umgang von eingabe Fehlern



  • Moin,

    Ich schreibe im Moment ein kleines text basiertes Spiel.

    Mein Code für mein Menü (gekürzt):

    do
    {
         int z;
         cout <<"(1) Spiel starten" <<endl;
         cout <<"(0) Spiel beenden" <<endl;
    
         cin >> z;
    
         switch (z)
         {
         case 1:
            {
    
            }break;
         case 2:
            {
    
            }break;
         default:
            {
                cout <<"Falsche Eingabe!" <<endl;
            }
         }
    }while (z != 0);
    

    Wenn man nur aber statt einer Zahl einen Buchstaben oder Sonderzeichen eingibt, hängt sich das Programm in der darauf Folgenden Schleife auf. (ich hoffe man versteht was ich meine)

    Kann mir jemand sagen wie ich das Problem lösen, bzw. umgehen kann?
    gibt es einen bessern Datentyp um das zumachen?
    Oder gibt es dafür was besseres als "cin"?

    Ich programmiere noch nicht so Lange 😃

    Schon mal danke im Voraus 😉





  • ok, danke aber gibt es keinen eleganteren weg alles bei jedem "cin" das alles zu schreien?

    Ich arbeite an einem kleinen Text-RPG und benutze daher für fast alle Interaktionen "cin"...



  • Man munkelt dass man in C++ eigene Funktionen definieren kann.



  • Sipps schrieb:

    Oder gibt es dafür was besseres als "cin"?

    Versuch mal:

    z = getchar() - '0';
    

    das verarbeitet alle zeichen und liefert für die tasten 0...9 die zahlen 0...9



  • ich behaupte jetzt einfach mal, dass dieses problem nicht mehr auftritt, wenn du an stelle von int einfach char verwendest.



  • HansKlaus schrieb:

    ich behaupte jetzt einfach mal, dass dieses problem nicht mehr auftritt, wenn du an stelle von int einfach char verwendest.

    und auf Zeichen testest.



  • @hustbaer

    hustbaer schrieb:

    Man munkelt dass man in C++ eigene Funktionen definieren kann.

    das ist mir schon klar, nur fällt mir keine ein mit der ich nicht das selbe problem bekomme, es wäre sehr geil wenn du mir ein Beispiel geben könntest oder das noch ein bisschen weiter ausführst ;*

    _______________________________________________________________________________

    @Hansklaus
    @DirkB

    DirkB schrieb:

    HansKlaus schrieb:

    ich behaupte jetzt einfach mal, dass dieses problem nicht mehr auftritt, wenn du an stelle von int einfach char verwendest.

    und auf Zeichen testest.

    also wenn ich nur "char" verwende passiert garnix mehr. Mir ist leider nicht klar wie ich auch "Zeichen" testen kann, könnt ihr mir das erklären oder einen Link schicken in dem das steht?

    _______________________________________________________________________________

    @Andromeda

    Andromeda schrieb:

    Sipps schrieb:

    Oder gibt es dafür was besseres als "cin"?

    Versuch mal:

    z = getchar() - '0';
    

    das verarbeitet alle zeichen und liefert für die tasten 0...9 die zahlen 0...9

    wenn ich das so probiere, dann springt der ohne Eingabe ein mal auf den Default Zweig und fragt mich dann erst was ich machen will 😕



  • Die Zahl 1 ist etwas anderes als das Zeichen '1' 😉



  • Sipps schrieb:

    Mir ist leider nicht klar wie ich auch "Zeichen" testen kann, könnt ihr mir das erklären oder einen Link schicken in dem das steht?

    Schau dir mal eine ASCII Tabelle an.

    Da hat das Zeichen, das die Ziffer Eins darstellt den Wert 49.
    jetzt kannst du in deinem Programm case 49: schreiben.

    Das ist aber blöd, da es schlecht lesbar ist (du verwendest eine Magic Number)
    (und es gibt noch andere Codes als ASCII)

    Du kannst daher in C++ einfach das Zeichen angeben. Das geschieht, indem du es zwischen einfache Hochkommas einschließt: '1'
    Dies ist für C++ auch nur ein Ganzzahlwert. (Im Gegensatz zu dem Stringliteral "1")

    Darum schreibst du case '1':



  • @DirkB

    Ah, danke für die Erklärung 🙂

    das war mir garnicht klar, das wir in meinem Buch auch nicht erwähnt 😃
    danke 🙂



  • Sipps schrieb:

    @DirkB

    Ah, danke für die Erklärung 🙂

    das war mir garnicht klar, das wir in meinem Buch auch nicht erwähnt 😃
    danke 🙂

    Und weil die Zeichen '0', '1', '2', ..., '9' laut Asciitable aufeinander folgen, kannst du einfach das Zeichen '0' von jedem Zeichen abziehen und bekommst die Zahlen 0,1,2, ... 9. 🙂



  • ja oder xor 48 bzw. xor 0x30 verknüpfen, geht schneller. 🙄

    jedenfalls sollte man bei einstelligen zahlen, mit denen man nicht rechnen will, immer char verwenden und auf zeichenwerte prüfen.



  • HansKlaus schrieb:

    ja oder xor 48 bzw. xor 0x30 verknüpfen, geht schneller. 🙄

    jedenfalls sollte man bei einstelligen zahlen, mit denen man nicht rechnen will, immer char verwenden und auf zeichenwerte prüfen.

    Kannst du das begründen?



  • HansKlaus schrieb:

    ja oder xor 48 bzw. xor 0x30 verknüpfen, geht schneller. 🙄

    Was das nicht so um 1998 zum letzten mal der Fall?



  • HansKlaus schrieb:

    ja oder xor 48 bzw. xor 0x30 verknüpfen, geht schneller. 🙄

    Mal abgesehen vom xor: 0x30, 48 oder '0' ist bei ASCII identisch. Da ist kein Unterschied im Maschinencode.

    Vermeide Magic Numbers. Das ist schlecht lesbar.



  • Vorsicht mit impliziten Voraussetzungen. C++11 garantiert (2.3), daß die values von '0', '1', ... '9' im Abstand von 1 aufeinander folgen. Deshalb kann man z.B. '4' - '2' berechnen.



  • Andromeda schrieb:

    HansKlaus schrieb:

    ja oder xor 48 bzw. xor 0x30 verknüpfen, geht schneller. 🙄

    jedenfalls sollte man bei einstelligen zahlen, mit denen man nicht rechnen will, immer char verwenden und auf zeichenwerte prüfen.

    Kannst du das begründen?

    additionen benötigen mehr takte als xor-verknüpfungen, da erstere zusätzlich zur eigentlichen summe noch das carry-bit berechnen müssen, während letztere quasi in einem arbeitsgang ausgeführt werden können.



  • HansKlaus schrieb:

    Andromeda schrieb:

    HansKlaus schrieb:

    ja oder xor 48 bzw. xor 0x30 verknüpfen, geht schneller. 🙄

    jedenfalls sollte man bei einstelligen zahlen, mit denen man nicht rechnen will, immer char verwenden und auf zeichenwerte prüfen.

    Kannst du das begründen?

    additionen benötigen mehr takte als xor-verknüpfungen, da erstere zusätzlich zur eigentlichen summe noch das carry-bit berechnen müssen, während letztere quasi in einem arbeitsgang ausgeführt werden können.

    Und den zweiten Satz?



  • naja welchen zweck hat es, bei der abfrage von tastendrücken bzw. von einzelnen zeichen den zahlenwert zu verwenden?



  • HansKlaus schrieb:

    additionen benötigen mehr takte als xor-verknüpfungen, da erstere zusätzlich zur eigentlichen summe noch das carry-bit berechnen müssen, während letztere quasi in einem arbeitsgang ausgeführt werden können.

    Das kannste so pauschal nicht sagen. Die Summe und das Carry-Bit entstehen doch in einem Rutsch. XOR, AND, OR wie auch SUB und ADD müssten gleich schnell sein, nämlich 1 Takt für die eigentliche Operation. Das Laden der Operanden in die Register lassen wir mal unberücksichtigt.

    Relativ langsam sind Multiplikation und Division mit Digitalrechnern, wenn man nicht gerade mit Zweierpotenzen arbeitet.


Anmelden zum Antworten