# Überspringen einer scanf_Anweisung in C



## gingele (31 Dezember 2008)

Hallo,

ich versuche gerade in den Ferien meine erlernten C-Kenntnisse zu festigen und Versuche einige Übungsaufgaben. Doch bei dieser Aufgabe stoße ich auf ein Problem wo ich nicht weiter weiß.
Ich soll einen Taschenrecher mit den Grundrechenarten programmieren, ist auch eigentlich nicht schwer, kappt soweit beim ersten Rechendurchgang auch, doch der Rechner soll erst beendet werden wenn als Operator q geschreiben wird, somit läuftder Rechner bei nicht eingabe q, beim ersten Durchgang, wieder von vorne los, doch diesesmal kann ich keinen Operator reinschreiben, da die scanf-Anweisung 
	
	



```
"Bitte Eingabe Operator"
```
 übersprungen wird und gleich die Eingabe kommt
	
	



```
"Bitte Eingabe Operand1"
```
 
Hier mal das Programm:

```
#include <stdio.h>
float calculate(char optr, float opr1, float opr2)
{
float erg;
switch(optr)
{
case('+'):
erg=opr1+opr2;
break;
case('-'):
erg=opr1-opr2;
break;
case('*'):
erg=opr1*opr2;
break;
case('/'):
erg=opr1/opr2;
break;
}
return erg;
}
int main(void)
{
float opr1;
float opr2;
char optr='0';
float erg; 
while(optr!='q')
{
printf("\nEingabe: Operator <return> Operand1 <return> Operand2 <return>");
printf("\nBitte Eingabe Operator (+, -, *, /, q): ");
scanf ("%c", &optr);
if(optr!='q')
{
printf("\nBitte Eingabe Operand1: ");
scanf ("%f", &opr1);
printf("\nBitte Eingabe Operand2: ");
scanf ("%f", &opr2); 
printf("\nErgebnis: %f %c %f = %f\n",opr1, optr, opr2, calculate(optr,opr1,opr2));
}
else
{
break;
}
}
return 0;
}
```


----------



## gingele (31 Dezember 2008)

Für die bessere Lesbarkeit stell ichs als Anhang mit rein


----------



## Rainer Hönle (31 Dezember 2008)

Eventuell ist das CR noch im Tatstaurpuffer und wird mittels scanf ausgelesen. Welchen Wert hat denn optr? Wird gar keine der Anfangs-Ausgaben erzeugt?


----------



## gingele (31 Dezember 2008)

Doch es kommen beim zweiten Durchlauf dann die Ausgaben:


Eingabe: Operator  <return> Operand1 <return> Operand2 <return>
Bitte Eingabe Operator (+, - *, /):
Bitte Eingabe Operand1:


quasi kann ich dann Operand1 eingeben aber keinen Operator, und wenn ich beim ersten Durchlauf z.b ein + reingeschrieben habe und halt dann einfach beim zweiten Durchgang die Operanden eingebe ist das + nicht mehr da.


----------



## gingele (31 Dezember 2008)

Rainer Hönle schrieb:


> Eventuell ist das CR noch im Tatstaurpuffer und wird mittels scanf ausgelesen.


 
Was bedeutet das ???


----------



## Thomas_v2.1 (31 Dezember 2008)

gingele schrieb:


> Was bedeutet das ???



Guck mal hier, da ist das Problem mit scanf beschrieben:

http://openbook.galileocomputing.de/c_von_a_bis_z/c_005_001.htm#RxxobKap005001040025E21F04018C


----------



## gingele (31 Dezember 2008)

Also das Problem habe ich erkannt, nach ner Lösung such ich jetzt mal, ich Versuch das Programm umzumodeln. Der Befehl fflush geht leider nicht da ich linux verwende, aber da ich jetzt weis wo das problem liegt weiß ich besser wie ich programmieren muß.

Danke nochmals und einen guten Rutsch.

gruß Frank


----------



## Rainer Hönle (31 Dezember 2008)

Prüf doch einmal den gelesenen Wert.

```
printf("\nBitte Eingabe Operator (+, -, *, /, q): ");
while(optr!='q' && optr!='+' && optr!='-" && optr!='*' && optr!='/')
{
  scanf ("%c", &optr);
}
if(optr!='q') 
....
```


----------



## gingele (31 Dezember 2008)

So funktioniert es leider auch nicht, die Funktion ist wie vorher.


----------



## Rainer Hönle (31 Dezember 2008)

ok, kleine Änderung:

```
optr=0;
printf("\nBitte Eingabe Operator (+, -, *, /, q): ");
while(optr!='q' && optr!='+' && optr!='-" && optr!='*' && optr!='/')
{
  scanf ("%c", &optr);
}
if(optr!='q') 
....
```


----------



## gingele (31 Dezember 2008)

Danke Rainer, jetzt Funktioniert es, das heißt ja im optr war noch der vorher eingegebene Wert, oder. Sonst wär es ja nach deinem Vorschlag ohne optr=´0´; gegangen.


----------



## Rainer Hönle (31 Dezember 2008)

Stimmt genau.


----------



## gingele (2 Januar 2009)

Es ist noch ne weitere Lösungsmöglichkeit, einfach beim scanf-Befehl eine Leertaste vorher eingeben quasi:

scanf("_%c", optr);

Hat mir heute ein Studienkollege verraten, der mal das selbe Problem hatte.


----------

