Umgang mit scanf

darton

Grünschnabel
Hallo,
ich habe die letzten drei Jahre nur Java programmiert und muss für die Uni nun C lernen.
Das hier ist ein einfaches Programm, was eine Zahl >10 einlesen soll und diese anschließend ausgibt.
Code:
#include <stdio.h>
int main(void)
{
	int zahl;
	int ok = 0;
	printf("Bitte eine Zahl > 10 eingeben\n");
	do
	{		
		ok = scanf("%d", &zahl);
		if (ok > 0 && zahl > 10)	
		{
			printf("%d\n", zahl);	
			return 0;
		} else 
			printf("Ungueltiges Format\n");
			
	} while (getchar() != '\n');
}
Jetzt habe ich diese beiden Probleme:
1. Wenn ich z.B. eine 8 eingebe, ist dies ja ein falscher Wert, weil kleiner 10. Das Programm geht aber dennoch aus der while-Schleife raus, obwohl vorher "Ungueltiges Format" ausgegeben wird. Warum? Und wie kann ich das verhindern?
2. Wenn ich einen Buchstaben eingebe, soll er logischerweise auch "Ungueltiges Format" anzeigen. Das tut er auch. Aber wenn ich mehrere Buchstaben eingebe, dann wird mir "Ungueltiges Format" mehrmals angezeigt und zwar genauso oft wie die Anzahl der Buchstaben, die ich eingegeben habe. Wie kann das sein?
 
Hallo,

1. Der Zeilenvorschub ist mit '\r' kodiert, so dass die Abfrage in der do ... while Schleife nicht greift.
2. Aufgrund der Formatangabe in der scanf-Funktion wird jeder Buchstabe einzeln gelesen, weil nach dem ersten Zeichen das Einlesen aufgrund des nicht übereinstimmenden Formates abgebrochen wird. Dann macht die Schleife mit dem nächsten Zeichen weiter.


Gruß
MCoder
 
Hi.
1. Der Zeilenvorschub ist mit '\r' kodiert, so dass die Abfrage in der do ... while Schleife nicht greift.
Die Standardeingabe ist aber nicht im Binär- sondern im Textmodus geöffnet. D.h. ein CRLF wird nach LF übersetzt. Oder wie kommst du auf \r?

@darton: Um eine Zahl einzugeben, mußt du ja die Return-Taste drücken. Wenn du "8 RETURN" eingibst, dann befindet sich "8 \n" im Eingabestrom. Die 8 wird nach zahl eingelesen und das \n liest du mit getchar aus. Deswegen bricht deine Schleife ab.

Du solltest die Schleife erst verlassen, wenn entweder nichts mehr von stdin eingelesen werden kann (ok == EOF ist) oder zahl ordentlich eingelesen wurde und größer als 10 ist.

zu 2) wenn ok == 0 ist, lies solange Zeichen bis du auf ein \n oder EOF triffst

Gruß
 
Hab jetzt folgendes ausprobiert:
Code:
#include <stdio.h>
int main(void)
{
	int zahl;
	int ok = 0;
	printf("Bitte eine Zahl > 10 eingeben\n");
	do
	{		
		ok = scanf("%d", &zahl);
		if (ok > 0 && zahl > 10)	
		{
			printf("%d\n", zahl);	
			return 0;
		} else 		
			printf("Ungueltiges Format\n");			
		
	} while (ok != EOF);
}
Ich lande aber in einer Endlosschleife, in der die ganze Zeit "Ungueltiges Format" wiederholt wird. Wird denn nicht auf die Rückgabe von scanf gewartet? Was kann ich dagegen tun?
 
Ich lande aber in einer Endlosschleife, in der die ganze Zeit "Ungueltiges Format" wiederholt wird. Wird denn nicht auf die Rückgabe von scanf gewartet?
Wenn du etwas ungültiges eingibst, dann kann scanf diesen Wert nicht konvertieren. Dieser Wert bleibt dann für immer in dem Eingabestrom stehen. Du versuchst also immer wieder in der Schleife die gleiche ungültige Eingabe mit scanf zu lesen...

Was kann ich dagegen tun?
Das hatte ich dir bereits erläutert. Du mußt die ungültige Eingabe entfernen.

Gruß
 
Hab gerade herausgefunden, dass man mit "fpurge(stdin);" den Inputpuffer leeren kann. Jetzt funktionierts auch. Ich hoffe, dass ich nun den richtigen Befehl verwendet habe.
 
Ja, aber wie? Mit "fflush(stdin);" funktioniert das leider nicht.
Auch das hatte ich dir bereits gesagt. fflush(stdin) ist keine gute Idee, da das Verhalten undefiniert ist.
Hab gerade herausgefunden, dass man mit "fpurge(stdin);" den Inputpuffer leeren kann. Jetzt funktionierts auch. Ich hoffe, dass ich nun den richtigen Befehl verwendet habe.
fpurge ist keine Standardfunktion. Welches Betriebssystem verwendest du denn?

Gruß
 
Windows 7. Aber das Programm muss auch auf Linux laufen. Tut fpurge das?
Aber da ich cygwin mit gcc benutze, sollte es doch auch auf Linux laufen, oder?
 

Neue Beiträge

Zurück