Eingabe nur Zahlen akzeptieren
-
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
-
BunterVogel schrieb:
Das mit "ignore_rest_of_line" weiß ich nicht mehr, warum ich das verwendet hatte.
Wie kommst du denn jetzt auf das nicht standardkonforme fflush(stdin)?
Genau das soll doch ignore_rest_of_line ersetzen.
Und es ist immer gut zu wissen, was man tut.BunterVogel schrieb:
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.
Ist klar, denn scanf liest solange ein, wie es zulässige Werte vorfindet. (darum auch meine Frage vorhin)
BunterVogel schrieb:
Wie könnte ich da ebenfalls einen Fehler ausgeben lassen
DirkB schrieb:
Lies die Eingabe mit fgets() ein und werte sie mit strtol() aus.
Wenn der endptr nicht auf '\n' zeigt, hast du einen Fehler.Oder lies das Zeichen direkt nach scanf dem("%d") ein. Dies muss ein '\n' sein.
Wenn nicht, hast du einen Fehler.
-
Das mit dem fflush(stdin) habe ich aus google gefunden, weil ich den Stream löschen wollte. Aber auch das mit ignore_rest_of_line funktioniert.
Aber so richtig verstehen tue ich nicht wasvoid ignore_rest_of_line(FILE *stream) { int fehler; do { fehler = fgetc(stream); } while(fehler != EOF && fehler != '\n'); }
macht.
[EDIT: ah stimmt , jetzt versteh ich, was du meinst. Schlau^^]~~Und wie kann ich das:
"Oder lies das Zeichen direkt nach scanf dem("%d") ein. Dies muss ein '\n' sein.
Wenn nicht, hast du einen Fehler."
machen.~~danke
-
scanf liest nur die Zeichen ein, die auch zu dem aktuellen Formatspecifier passen.
Da '\n' die Eingabe abschließt, wird solange ein Zeichen eingelesen, bis die Eingabe(zeile) beendet wurde.
Das EOF wird noch zur Sicherheit abgefragt.
-
Wie kann ich das Zeichen direkt nach dem SCANF dem ("%d") einlesen?
-
Ach komm.
Wie machst du es denn in ignore_rest_of_line ?Es gibt auch eine Funktion, der du den Stream nicht übergeben musst und direkt von stdin liest.
Schau mal, da wirst du sicher eine finden: http://www.cplusplus.com/reference/clibrary/cstdio/
-
EingabeA: // printf("\nGeben Sie bitte a ein"); // if(1==scanf("\n%i",&a)) // { printf("\n%d",a); do { a=getchar(); putchar (a); } while (a != '\n'); printf("FEHLER: ES IST KEIEN ZAHL"); }
Das mit getChar putChar haben wir in der FH gar nicht behandelt - deshalb blick ich da gerade gar nicht durch, was die dort machen. Ich hab da oben im Code was mit getchar und putchar eingefügt. Naja zumindest gibt es jetzt 44F aus wenn man 44F eingibt, und nicht nur 44 wie zuvor, aber wie ich das nutzen kann, weiß ich auch nicht. Bin am verweifeln^^
-
Lass mal Zeile 8 weg. Nein besser noch: Lass Zeile 8 weg und erklär mal, warum die da war.
c.rackwitz schrieb:
Wenn du selber Code schreibst, musst du ihn auch verstehen. Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur. Du musst genau wissen, warum du wo und welches Zeichen setzt.
Das gilt erst recht für ganze Funktionsaufrufe.
-
Dann lies dir doch mal durch was die Funktionen machen: getchar und putchar
Eigentlich sind die Funktionsnamen schon sehr sprechend.Also nochmal:
Nach scanf ein Zeichen einlesen. Wenn das Zeichen gleich '\n' ist, ist alles in Ordnung.
Sonst ist es ein Fehler und du musst noch den Rest der Zeile einlesen.
-
Naja, das hab ich auch gemacht. Wenn ich Zeile 8 weg mache.
Kommt bei 44F eingabe nur 44 heraus.
Mit der Zeile 8 kommt 44F heraus. Ich denke mal, dass durch PUTchar das F mitgegeben wird, und dieser dann in der PRINTF erscheint.