Frage zum Befehl: Scanf mit unterschiedlichen Datentypen

hanow

Mitglied
Guten Morgen, Alle

Ich schreibe gerade einen einfachen Taschenrechner und habe Probleme mit Kommandozeileneingaben.

Das Ziel meines Programms ist:

In der Kommandozeile die 1. (int)Zahl eingeben, dann den (char)Operator eingeben, danach die 2. (int)Zahl, fertig.

Aber wenn ich die 1. Zahl eingegeben und Enter gedrückt habe, wird das Programm direkt zum 3. scanf überspringen...Weiß jemand woran es liegen könnte?

mein Code sieht zum Teil wie folgendes:

C++:
    int z1, z2;
    char opr = 0;


    printf("Geben Sie bitte die erste Ganzzahl ein: ");
    scanf("%d", &z1);
    printf("\n\n");

    printf("Welchen Operator wird erwuenscht: ");
    scanf("%c", &opr);
    printf("\n\n");

    printf("Geben Sie bitte die zweite Ganzzahl ein: ");
    scanf("%d", &z2);
    printf("\n\n");

    printf("\n-----------------------------------------------------------------------\n");

    rechnen(z1, z2, opr);

    printf("\n\n");


Das Ergebnis :

*** WELCOME TO SIMPLE CALCULATOR 2015 ***

Geben Sie bitte die erste Ganzzahl ein: 3


Welchen Operator wird erwuenscht:

Geben Sie bitte die zweite Ganzzahl ein: +



-----------------------------------------------------------------------

Operator
ist nicht gueltig.


Vielen Dank für eure Hilfe.

LG, Carvin
 
Funktion rechnen sieht so aus:

C++:
#include <stdio.h>
#include "header/taschenrechnerv1.h"

void rechnen(int first, int sec, char op){

    switch( op ){

        case '+':
            printf("Ergebnis fuer %d + %d: %d", first, sec, first + sec);
            break;
        case '-':
            printf("Ergebnis fuer %d - %d: %d", first, sec, first - sec);
            break;
        case '*':
            printf("Ergebnis fuer %d * %d: %d", first, sec, first * sec);
            break;
        case '/':
            printf("Ergebnis fuer %d / %d: %.2f", first, sec, first / sec);
            break;
        case '^':
            printf("Ergebnis fuer %d ^ %d: %d", first, sec, first ^ sec);
            break;
        case '%':
            printf("Ergebnis fuer %d %c %d: %.2f", first, op, sec, first % sec);
            break;
        default:
            printf("\nOperator %c ist nicht gueltig.\n", op);
            break;
    }

}


Danke.
 
Hi, MCoder

Danke für die Antwort, doch habe ich mit setvbuf(stdout, NULL, _IONBF, 0); geleert , und es funktioniert ohne problem mit scanf für Zahlen, Aber wenn ich zwischen zwei Zahlen einen Char per cmd übergebe, dann wird der Schritt für char-Eingabe überspringen zur zweiten Zahleneingabe... Warum?

LG
 
Sorry, ich habe vergessen zu schreiben, ich benutze Eclipse Luna unter Windows 8.

Und nach jedem Scanf Aufruf habe ich den Befehl fflush(stdin); hinzugefügt, aber nach dem Kompilieren wird der Text, der oberhalb vom befehl steht auch nicht mehr gezeigt...
 
Ich vermute, dir ist die Bedeutung vom setvbuf nicht klar,
außerdem verwendest du es für stdout => irrelevant für Eingaben.
 
Hi hanow,

Ich kenn mich in C nicht mega optimal aus, aber wenn ich gerade richtig recherchiert habe, dann sollte es so funktionieren (ich weiß allerdings nicht, ob das guter Stil ist oder einfach nur quick and dirty...wie gesagt bin eigentlich kein C-progger).

Probier mal nach deinen scanf()'s jeweils ein...
C:
while ( getchar() != '\n' );
...einzufügen, dass sollte den übrig gebliebenen Linefeed im Eingabepuffer rausnehmen.

Gruß
Daniel
 
Hi hanow,

Ich kenn mich in C nicht mega optimal aus, aber wenn ich gerade richtig recherchiert habe, dann sollte es so funktionieren (ich weiß allerdings nicht, ob das guter Stil ist oder einfach nur quick and dirty...wie gesagt bin eigentlich kein C-progger).

Probier mal nach deinen scanf()'s jeweils ein...
C:
while ( getchar() != '\n' );
...einzufügen, dass sollte den übrig gebliebenen Linefeed im Eingabepuffer rausnehmen.

Gruß
Daniel

Hi, Daniel

Danke für die Antwort, dein Vorschlag funktioniert bei mir. Wenn der Befehl den Puffer leeren würde, müsste er nach jedem Aufruf von Scanf eingefügt werden...ich suche einen Befehl der nur einmalig für den ganzen Code geht.
 
Zuletzt bearbeitet:
Zurück