Taschenrechner - Tastaturpuffer löschen, Fehlermeldung rausgeben (%[^liste])



  • Hallo!

    Ich muss als Aufgabe einen Taschenrechner zusammentippen. Dabei soll mein Programm in einer Schleife 3 Eingaben akzeptieren: Eine Operation (+,-,*,/,q) und 2 Operanden, wobei bei Eingabe von "q" das Programm beendet wird.

    char operation;
    float opr1, opr2;
    
     do
        {
              printf("Bitte Eingabe Operator: ");
              scanf("%c",&operation);
    
              printf("Bitte Eingabe Operand1: ");
              scanf("%f",&opr1);
    
              printf("Bitte Eingabe Operand2: ");
              scanf("%f",&opr2);
    
     }while(operation != 'q');
    
    return 0;
    

    Nun ja, nach dem ersten Schleifendurchlauf funktioniert alles wie gedacht. Bei jedem weiteren Durchlauf bescheißt mich das Ding um die Eingabe von "operation".
    Ich weiß, dass man an dieser Stelle den Tastaturpuffer leeren muss.

    Nur:

    -Aus welchem Grund?
    -und womit?

    (getchar() liefert hier kein zufriedenstellendes Ergebnis)

    Desweiteren soll ich überprüfen, ob als Operation ein konformes Zeichen eingegeben wurde. Wenn nicht, soll er eine Fehlermeldung rausspucken und um eine neue Eingabe verlangen:

    printf("Bitte Eingabe Operator: ");
     scanf("%c",&operation);
    
     if(operation != '+' || operation != '-' || usw...){
     printf("Fehlermeldung");
     continue;
     }
    

    Bloß dieser Bedingung-Block der if-Anweisung gefällt mir nicht.

    Es besteht an der Stelle ja die Möglichkeit den Formatbezeichner

    %[^liste]
    

    zu verwenden. Nämlich gleich beim Einlesen mit scanf().

    Also in der Form dann:

    printf("Bitte Eingabe Operator: ");
     scanf("%[^+,-,*,/,q]",&operation);
    

    Gibt es eine Möglichkeit %[^liste] in der if-Bedingung zu verwenden, um eben die besagte Fehlermeldung rauszugeben?



  • Die_Muh_Kuh schrieb:

    Ich weiß, dass man an dieser Stelle den Tastaturpuffer leeren muss.

    Nur:

    -Aus welchem Grund?
    -und womit?

    weil scanf beim zweiten durchlauf noch das '\n' vom ersten durchlauf selbständig ohne warnung einliest. für weitere erklärungen hab ich jetzt keine zeit mehr, siehe z.b. gallileo openbook usw...
    kannst den puffer leeren, indem du vor jedem scanf, fgets etc.
    z.b. diese beiden zeilen schreibst oder besser noch als funktion auslagerst:
    setvbuf( stdin, NULL, _IONBF, 0 );
    setvbuf( stdin, NULL, _IOFBF, BUFSIZ );

    Die_Muh_Kuh schrieb:

    Desweiteren soll ich überprüfen, ob als Operation ein konformes Zeichen eingegeben wurde. Wenn nicht, soll er eine Fehlermeldung rausspucken und um eine neue Eingabe verlangen

    char Op;
    if ( 1 == scanf("%[+,-,*,/,q]c",&Op) )
    		printf("Eingabe, Operatorc OK");
    	else
    		printf("Eingabe, Operator Kagge !" );
    


  • Der_Wau_Wuff schrieb:

    Die_Muh_Kuh schrieb:

    Ich weiß, dass man an dieser Stelle den Tastaturpuffer leeren muss.

    Nur:

    -Aus welchem Grund?
    -und womit?

    weil scanf beim zweiten durchlauf noch das '\n' vom ersten durchlauf selbständig ohne warnung einliest. für weitere erklärungen hab ich jetzt keine zeit mehr, siehe z.b. gallileo openbook usw...
    kannst den puffer leeren, indem du vor jedem scanf, fgets etc.
    z.b. diese beiden zeilen schreibst oder besser noch als funktion auslagerst:
    setvbuf( stdin, NULL, _IONBF, 0 );
    setvbuf( stdin, NULL, _IOFBF, BUFSIZ );

    Die_Muh_Kuh schrieb:

    Desweiteren soll ich überprüfen, ob als Operation ein konformes Zeichen eingegeben wurde. Wenn nicht, soll er eine Fehlermeldung rausspucken und um eine neue Eingabe verlangen

    char Op;
    if ( 1 == scanf("%[+,-,*,/,q]c",&Op) )
    		printf("Eingabe, Operatorc OK");
    	else
    		printf("Eingabe, Operator Kagge !" );
    

    oh, wauwi, das hast du aber fein gemacht. soll ich dich zur belohnung am ohr kraulen ? 🙂 *bussie* mauzie wauzie


Anmelden zum Antworten