Eingabe in zwei Variablen



  • Schönen guten Tag,
    ich habe das Problem, dass ich eine Eingabe mit

    scanf("%lf",&eingabe);
    

    erfassen muss. Habe aber das Problem, dass ich bei dieser Eingabe nicht weiß, wie ich die Eingabe von Buchstaben mit einer if-Anweisung verwerfen soll. Gibt es die Möglichkeit, dass man eine Eingabe in zwei Variablen schreiben kann? Also einmal in die Variable Eingabe von Typ double und einmal in EIngabe2 von typ int. Somit kann ich Buchstaben mit der ASCII Tabelle ausschließen.



  • Dein obiges Code-Fragment schließt doch schon Buchstaben aus (bzw würde beim ersten Zeichen, daß nicht zu einem float-Wert passt, mit dem Einlesen aufhören). Und eine int-Variable reagiert genauso auf Buchstaben wie ein double, du könntest höchstens ein char-Array einlesen und dann überprüfen und per sscanf() nach int/double/... parsen.



  • scanf hat nen Rückgabewert, den kannste zum Testen benutzen.

    Siehe auch hier: http://www.pronix.de/pronix-657.html

    MfG

    GPC



  • ja wär es möglich eine eingabe in zwei variablen zu speichern, in Eingabe typ double und Eingabe2 typ char.



  • na ja, double und char ist vllt. etwas ungünstig, aber int und double können wir machen, jedoch in zwei Variablen:

    #include <stdio.h>
    
    int main() {
       double a;
       int b;
    
       printf("Bitte Eingabe machen (Fliesskommazahl/ganzzahl): ");
       scanf("%lf %d",&a,&b);
       printf("%lf\n%d", a,b);
       return 0;
    }
    

    Willst du eine Eingabe in zwei schreiben, musst du erst in eine reinlesen und dann hinterher an die andere zuweisen.

    MfG

    GPC



  • Ich versuche einfach nur die Eingabe von Buchstaben auszuschließen, aber es klappt einfach nicht. Die Variable Eingabe muss allerdings double bleiben.

    #include <stdio.h>
    main()   {
    int check, tempcheck;
    double eingabe;
    do{
        fflush(stdin);
        tempcheck = 0;
        printf("Eingabe: ");
        check = scanf("%lf ",&eingabe);
        if (check == 'a'){tempcheck = 1;}
    }while (tempcheck == 1 );
    


  • Schau dir doch mal den Rückgabewert von scanf() an - der liefert die ANZAHL der korrekt erkannten Werte zurück und nicht das erste "falsche" Zeichen.



  • Wo ist das Problem? Mit folgendem Code bist du auf der sicheren Seite:

    #include <stdio.h>
    
    void clearStdin() {
      int c;
      while ((c = getchar()) != '\n' && c != EOF);
    }
    
    int main() {
      double d=0;
      int check = 0;
    
      do {
        puts("Eingabe: ");
        check = scanf("%lf", &d);
        clearStdin();
      }while (check!=1);
    
      printf("\n%lf", d);
    
      return 0;
    }
    

    Noch was: Meide fflush(stdin), lies hier, warum: http://www.c-plusplus.net/forum/viewtopic.php?t=39349

    MfG

    GPC



  • Danke, das Problem ist gelößt.
    Allerdings versteh ich die Aufgabe von der Funktion nicht ganz.
    Also was die genau macht.

    while ((c = getchar()) != '\n' && c != EOF);
    


  • Die Funktion liest solange Zeichen von Tastatur (c=getch()), bis es entweder ein Newline ('\n') oder ein End of File (EOF) eingelesen hat - sprich: Nach einer ungültigen Eingabe wird der Rest der Zeile bis zum ENTER gelesen und verworfen.



  • Kann mir vielleicht jemand noch mal erklären wie der Vorgang genau abläuft?
    Es funktionier zwar alles super, kann es aber immer noch nicht zu 100% nachvollziehen.
    Vor allem das mit der While-Schleife und der Variable check.

    int c, check = 0;
    double eingabe;
    
    do{
    printf("Eingabe: ");
    check = scanf("%lf",&eingabe);
    while ((c = getchar()) != '\n' && c != EOF);
    }while (check !=1 );
    


  • check sagt aus, wie viele Werte erfolgreich eingelesen werden konnten. Wir wollen nur einen Wert einlesen, klappt das nicht, ist check gleich 0, also ungleich 1.
    Deshalb läuft die Schleife so lange, bis check 1 ist und d.h., der Wert konnte erfolgreich eingelesen werden.

    MfG

    GPC



  • @while-Schleife:
    getch() liest das nächste Zeichen von Tastatur - und das wird solange wiederholt, bis entweder EOF erreicht ist oder '\n' (=ENTER) eingelesen wurde.
    -> Du liest und verwirfst den Rest der Eingabezeile.

    @check:
    Der Rückgabewert von scanf() gibt an, wieviele Parameter erkannt und zugewiesen wurden. D.h. wenn dort 1 zurückgekommen ist, wurde 1 Wert gelesen (und in "eingabe" gespeichert), wenn ein anderer Wert zurückkommt, gab es einen Eingabefehler.



  • An wo wird genau festgelegt, dass nur Zahlen zugelassen sind und Buchstaben und Zeichen ausgeschlossen werden. Also es dann zu einer erneuten Eingabe kommt.



  • Ok, also wenn ich dem scanf den Format String mitgebe ("%lf"), dann sage ich ihm: "Lies ein double ein." Schafft er das nicht, weil der User z.B. einen Buchstaben bzw. einen String eingibt, wird 'check' NICHT auf 1 gesetzt, weil KEIN Wert korrekt eingelesen werden konnte. Das prüft er dann in der Schleife und macht es sooo lange bis ein double korrekt eingelesen werden konnte (dann wird check auch auf 1 gesetzt).

    Capiche? Nein? Lies die Doku: http://www.cppreference.com/stdio/scanf.html

    MfG

    GPC


Anmelden zum Antworten