Eingabe nur Zahlen akzeptieren
-
Hallöle, ich habe folgenden Code, wo ich alles außer Zahlen blockieren möchte. Also der User soll nur Zahlen eingeben können.
void ignore_rest_of_line(FILE *stream) { int fehler; do { fehler = fgetc(stream); } while(fehler != EOF && fehler != '\n'); printf("Geben Sie bitte a ein"); // Aufforderung zur Eingabe der ersten Zahl scanf("%d",&a); ignore_rest_of_line(stdin); // Durch ScanF wird die erste Zahl eingescannt printf("Geben Sie bitte b ein"); // Aufforderung zur Eingabe der zweiten Zahl scanf("%d",&b); // Durch ScanF wird die zweite Zahl eingescann ignore_rest_of_line(stdin); }
Funktioniert aber nicht. In einem anderen Code von mir (da ging es um ein anderes Projekt, funktionierte das^^)... Kann mir wer helfen. Der Code oben ist nicht vollständig, die MAIN usw fehlt.
-
Schau dir mal an was der Rückgabewert von scanf() dir sagt
-
Der Rückgabewert ist doch eine Dezimalzahl?^^
-
BunterVogel schrieb:
Der Rückgabewert ist doch eine Dezimalzahl?^^
Und?
-
hmm^^ ?
ich komm nicht drauf
Das komische ist halt, dass ich das schon einmal bei einem anderen Code verwendet hatte, da hatte das wunderbar geklappt, aber hier will es nicht klappen.
Man kann nichts eintippen in dieser Form jetzt -.-
-
-
Man kann sehr einfach zunächst die Zeichen einzeln oder einen Character-String einlesen und der Reihe nach prüfen, ob sie eine Zahl (integer, double) ergeben können.
-
Ich komme nicht drauf.
Kann mir wer einfach sagen, wie das geht, oder was ich schreiben muss.
Also, dass bei der Eingabe von Text ein Fehler kommt (Quasi nur Zahlen werden akzeptiert). So richtig was finden tue ich nichts gerade.
-
Nochmal: Schau dir an was der Rückgabewert der Funktion scanf() bedeutet...
-
dot schrieb:
Nochmal: Schau dir an was der Rückgabewert der Funktion scanf() bedeutet...
Du meinst doch sicherlich das %d beim scanf("%d",&a); ?
Na dass er nur Dezimalzahlen einließt. Das ist ja auch schön und gut, der soll ja auch Zahlen einlesen. ABER bei Eingabe von Buchstaben wird das ganze in Zahlen umgewandelt, das will ich eben nicht, dass soll er als Fehlermeldung melden
-
BunterVogel schrieb:
Also, dass bei der Eingabe von Text ein Fehler kommt (Quasi nur Zahlen werden akzeptiert). So richtig was finden tue ich nichts gerade.
Was betrachtest du denn als Fehler?
12
12.
12 A
12Ab
AB
-
BunterVogel schrieb:
dot schrieb:
Nochmal: Schau dir an was der Rückgabewert der Funktion scanf() bedeutet...
Du meinst doch sicherlich das %d beim scanf("%d",&a); ?
Nein. Ich meine den Rückgabewert der Funktion, das was sie per return zurückgibt, nicht das was sie über irgendwelche Parameter zurückgibt.
-
DirkB schrieb:
BunterVogel schrieb:
Also, dass bei der Eingabe von Text ein Fehler kommt (Quasi nur Zahlen werden akzeptiert). So richtig was finden tue ich nichts gerade.
Was betrachtest du denn als Fehler?
12
12.
12 A
12Ab
ABalles außer das erste^^. Es sollen nur Zahlen akzeptiert werden.
-
dot schrieb:
BunterVogel schrieb:
dot schrieb:
Nochmal: Schau dir an was der Rückgabewert der Funktion scanf() bedeutet...
Du meinst doch sicherlich das %d beim scanf("%d",&a); ?
Nein. Ich meine den Rückgabewert der Funktion, das was sie per return zurückgibt, nicht das was sie über irgendwelche Parameter zurückgibt.
So richtig verstehen tue ich nicht, was du damit meinst.
printf("\nGeben Sie bitte a ein"); // Aufforderung zur Eingabe der ersten Zahl scanf("\n%d",&a); // Durch ScanF wird die erste Zahl eingescannt printf("\n%d",a);
Hab da mal eine "printf" eingebaut, um anzuzeigen welchen Wert denn "a" annimmt.
Wenn man eine Zahl eingibt eine Zahl eben, wenn man einen Buchstaben eingibt auch eine Zahl.
-
BunterVogel schrieb:
... wenn man einen Buchstaben eingibt auch eine Zahl.
Das ist dann aber der Wert, den a schon vorher hatte.
printf("\nGeben Sie bitte a ein"); // Aufforderung zur Eingabe der ersten Zahl
if(1==scanf("\n%d",&a);) // Wenn scanf einen Wert eingelesen hat. printf("\n%d",a); else printf("\n Fehler!",a);
Das ergibt aber nur einen Fehler, Wenn am Anfang keine Ziffer eingegeben wurde.
Lies die Eingabe mit fgets() ein und werte sie mit strtol() aus.
Wenn der endptr nicht auf '\n' zeigt, hast du einen Fehler.
-
Dir mangelt es offenbar massiv an Grundlagen...
Hier, vielleicht hilft das weiter:
int a; int rueckgabewert = scanf("%d", &a);
http://www.cplusplus.com/reference/clibrary/cstdio/scanf/ schrieb:
On success, the function returns the number of items successfully read. This count can match the expected number of readings or fewer, even zero, if a matching failure happens.
In the case of an input failure before any data could be successfully read, EOF is returned.
-
Ich glaube ich habs jetzt kappiert (jetzt funktioniert es auch (Danke DirkB)).
Die ScanF funktion gab bei Eingabe einer NICHT-ZAHL den Rückgabwert 0 aus.
Bei Eingabe einer Zahl gibt er mir 1 aus.Was ich aber nicht verstehe ist, warum spuckt er mir aber wenn ich mit PRINTF nach dem a Frage keine 1 oder 0 aus? Naja, besser gesagt, bei 1= spuckt er mir ja die Zahl korrekt aus, weil es eben eine Zahl ist, bei 0, gibt er mir eine lange Zahlenkette aus. Wieso ist das so?
-
EingabeA: printf("\nGeben Sie bitte a ein"); if(1==scanf("\n%d",&a)) { printf("\n%d",a); } else { printf("\n Fehler! Nur Zahlen erlaubt",a); goto EingabeA; } EingabeB: printf("Geben Sie bitte b ein"); if(1==scanf("\n%d",&b)) { printf("\n%d",b); } else { printf("\n Fehler! Nur Zahlen erlaubt",b); goto EingabeB; }
Wieso auch immer entsteht eine Endlos-Schleife beim GOTO.
Also wenn der USER eine NICHT-ZAHL eintippt, entsteht der Fehler, und ich habe da ein GOTO eingerichtet, damit er wieder zur Eingabe gelangt. Wieso da nun jetzt eine Endlose Schleife zwischen z.B.printf("\nGeben Sie bitte a ein");
printf("\n Fehler! Nur Zahlen erlaubt",a);ist mir'n Rätsel^^
-
Weil immer noch der Buchstabe im Eingabestrom steht.
Der wird von scanf (bei %d) nicht eingelesen.Weißt du jetzt, warum du dein
ignore_rest_of_line
benutzt hast?
-
Das mit "ignore_rest_of_line" weiß ich nicht mehr, warum ich das verwendet hatte.
EingabeA: // Sprungmarke, für Fehleingabe von a printf("\nGeben Sie bitte a ein"); // Aufforderung zur Eingabe von a if(1==scanf("\n%i",&a)) // Überprüfung ob Rückgabewert von scanf 1 ist (Format: Dezimalzahl) { printf("\n%i",a); } else { printf("\n Fehler! Nur Zahlen erlaubt"); fflush(stdin); goto EingabeA; } EingabeB: printf("Geben Sie bitte b ein"); if(1==scanf("\n%i",&b)) { printf("\n%d",b); } else { printf("\n Fehler! Nur Zahlen erlaubt"); fflush(stdin); goto EingabeB; } printf("\n Eingegebene Zahl a %i",a); printf("\n Eingegebene Zahl a %i",b);
Nun funktioniert das zwar, jedoch nur für Eingaben die mit einer NICHT_ZAHL beginnen. Wenn man mit einer Zahl beginnt, aber daraufhin ein Buchstabe oder ein Sonderzeichen kommt, werden die zwar herausgefiltert, jedoch wird kein Fehler ausgegeben. Wie könnte ich da ebenfalls einen Fehler ausgeben lassen