[C/C++] Eingabe prüfen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Floppy87, 10. November 2010 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 10. November 2010
    Eingabe prüfen

    moin moin

    wir sollen einen taschenrechner in c++ programmieren...ansich kein problem! allerdings bricht er ab, wenn man als eingabe einen buchstaben macht...und das soll verhindert werden!
    ich hab leider keine idee wie ich das am besten umsetze...
    der rechner funktioniert soweit...die division durch 0 hab ich auch schon abgefangen

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    float plus (float a, float b)
    {
     return (a + b);
    }
    
    float minus (float a, float b)
    {
     return (a - b);
    }
    
    float mal (float a, float b)
    {
     return (a * b);
    }
    
    float durch (float a, float b)
    {
     return (a / b);
     
    }
    
    int main ()
    {
     puts("Ein einfacher Rechner ;)");
     float a,b;
     puts("Bitte geben Sie eine Zahl ein und druecken Sie Enter!");
     scanf("%f",&a);
     
     puts("Bitte geben Sie noch eine Zahl ein und druecken Sie Enter!");
     scanf("%f",&b);
     
     getchar();
     
     printf("a + b ergibt: %f\n",plus(a,b));
     printf("a - b ergibt: %f\n",minus(a,b));
     printf("a * b ergibt: %f\n",mal(a,b));
     if (b != 0)
     {
     printf("a / b ergibt: %f\n\n",durch(a,b));
     }
     else
     {
     puts("Die Division durch 0 ist nicht moeglich!!\n\n");
     }
     
     
     puts("Enter druecken zum beenden!!");
     getchar();
     return (0);
    }
    ich hoffe ihr könnt mir da einwenig helfen?!
     
  2. 10. November 2010
    AW: Eingabe prüfen

    Vielleicht reicht es aus a und b mit 0 vorzuinitialisieren. Ich glaube wenn scanf nichts passendes feindet, überschreibts den wert nicht, somit hast du in den variablen immenroch 0 stehen. nicht schön, aber dafür stürzt es nicht mehr ab.

    ne andere möglichkeit: du legst dir nen charbuffer an, z.b. mit 64byte [dürfte lang genug sein für ne zahl], in diesen liesst du erstmal die eingabe.
    Entweder konvertierst du die eingabe dann mit atof in eine floatingpoint-number. atof liefert definitiv 0, wenn die eingabe unkorrekt war.
    oder aber du gehst das array erstmal zeichen für zeichen in einer schleife durch und checkst, ob andere chars enthalten sind, als zahlen, der punkt und das newline.
     
  3. 10. November 2010
    AW: Eingabe prüfen

    Inkludiere die cctype, iteriere durch alle Zeichen in dem String und checke jedes Zeichen mit isdigit();
    Damit weißt du, ob alle Zeichen des Strings Zahlen sind. Dafür kannst dir auch eine Funktion schreiben, wie du magst.

    Doku: cctype (ctype.h) - C++ Reference

    greez
     
  4. 10. November 2010
    AW: Eingabe prüfen

    scanf liefert dir als return-Wert die Anzahl der erfolgreich eingelesenen Werte.
    Wenn du also einen float einlesen willst ("%f"), gibt die Funktion im Erfolgsfall 1 zurück, willst du 2 einlesen ("%f %f"), gibt sie bei Erfolg 2 zurück usw.

    ergo müsste das funktionieren:

    Code:
    do{
     puts("Bitte geben Sie eine Zahl ein und druecken Sie Enter!");
    }while(scanf("%f",&a)!=1);
    
    Gruß,
    Figger

    //EDIT: hab ich noch vergessen: du musst nach ner fehlerhaften Eingabe noch den inputstream leerschaufeln, sonst hängste in ner endlosschleife...

    //EDIT2: und es muss natürlich != heißen in der while-Bedingung und nicht == ... habs mal editiert

    //EDIT3 (jetzt aber wirklich der letzte^^):

    eleganter gehts btw mit iostream:

    Code:
    #include <iostream>
    int readInt(char* prompt, int min=1) {
    
     int in;
     do {
     if (cin.fail()) {
     //Clear the fail state.
     cin.clear();
     //Ignore the rest of the wrong user input, till the end of the line.
     cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
     }
     cout << prompt;
     cin >> in;
    
     } while ((cin.fail() || in < min) && cout
     << "Fehlerhafte Eingabe. Bitte eine Ganzzahl >= " << min << " eingeben."
     << endl);
     return in;
    }
     
  5. 10. November 2010
    AW: Eingabe prüfen

    vielen dank für die hilfen, werd ich mir gleich mal genauer zu gemüte führen!!
     
  6. 10. November 2010
    AW: Eingabe prüfen

    Du benutzt in deiner Startpost C.
    Wenn ihr C++ benutzen sollt, würde ich dir auch empfehlen mit cin und cout zu arbeitenk, wie mein Vorredner es gemacht hat.
     
  7. 25. November 2010
    AW: Eingabe prüfen

    Am einfachsten kansnt du die eingabe mit einer ifabfrage abfangen.

    if(eingabe>='A' && eingabe<='Z')
    printf("Falsche eingabe");

    und wenn du die zeichen auch noch abfangen willst, musste einfach nur in der asciitabelle schauen und das gleiche mit den zeichen machen die du nicht haben willst und die kleinbuchstaben kannst du entweder mit toupper abfangen oda tolower... ansonsten auch einfach in eine ifabfrage.


    EDIT:
    if(eingabe<='/')
    {printf("Falsche eingabe");}
    if(eingabe>=':')
    {printf("Falsche eingabe");}

    also wenn du die 2 abfragen direkt nach der eingabe einfügst müsste es funktionieren^^ probiers einfach mal

    EDIT2: Sry, funktioniert wircklich nicht, Murdoc hat recht kleiner denkfehler ^^
     
  8. 26. November 2010
    AW: Eingabe prüfen

    das is blödsinn, denn was passiert wenn er 47 eingibt (was ja auch ein valider float-wert ist).
    am einfachsten liese sich das ganze wohl mit atof validieren (fehlerhafte werte ergeben 0). also nen char[] einlesen und dann mit atof in nen float-wert umwandeln.

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    float plus (float a, float b)
    {
     return (a + b);
    }
    
    float minus (float a, float b)
    {
     return (a - b);
    }
    
    float mal (float a, float b)
    {
     return (a * b);
    }
    
    float durch (float a, float b)
    {
     return (a / b);
    
    }
    
    int main ()
    {
     puts("Ein einfacher Rechner ;)");
    
     char a[64] = { '\0' },
     b[64] = { '\0' };
    
     puts("Bitte geben Sie eine Zahl ein und druecken Sie Enter!");
     gets(a);
    
     puts("Bitte geben Sie noch eine Zahl ein und druecken Sie Enter!");
     gets(b);
    
     float af = atof(a),
     bf = atof(b);
    
     printf("a + b ergibt: %f\n",plus(af, bf));
     printf("a - b ergibt: %f\n",minus(af, bf));
     printf("a * b ergibt: %f\n",mal(af, bf));
     if (bf != 0)
     {
     printf("a / b ergibt: %f\n\n",durch(af,bf));
     }
     else
     {
     puts("Die Division durch 0 ist nicht moeglich!!\n\n");
     }
    
    
     puts("Enter druecken zum beenden!!");
     getchar();
     return (0);
    }
    
     
  9. 26. November 2010
    AW: Eingabe prüfen

    Das Problem bei atof ist halt, dass man zwischen 0 als falscher Eingabe und 0 als richtiger Eingabe (also gewünschter Wert) nicht wirklich unterscheiden kann. Eine Alternative bietet strtof bzw. strtod (je nach Datentyp). Da kann man genau feststellen, an welcher Position vom Eingabestring er einen Fehler gefunden hat.

    Aber da du ja sowieso mit C++ programmierst, solltest du auch C++-Methoden verwenden. Die Istream-Klasse, welche den operator>> definiert, setzt entsprechende Fehlerbits, wenn es Fehler bei der Eingabe gegeben hat. Die kann man dann einfach abfragen und schauen, ob alles in Ordnung ist:

    Code:
    #include <iostream>
    
    int main() 
    {
     float f;
    
     std::cin >> f;
     if (!std::cin.good())
     {
     std::cout << "Fehler bei der Eingabe!" << std::endl;
     }
     else 
     {
     std::cout << "Eingegebener Wert: " << f << std::endl;
     }
    }
     
  10. 1. Dezember 2010
    AW: Eingabe prüfen

    vielen dank für die hilfen, habs hinbekommen

    ~close~
     
  11. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.