Eingabe nur Zahlen akzeptieren
-
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.
-
Fast. Nur hat printf damit gar nichts zu tun.
Mach malprintf("\n<%d>\n",a);
Wo kommt das F denn jetzt?
putchar ist eine eigenständige Ausgabe (für ein Zeichen).
printf benutzt auch nur putchar (oder fputc) zur Ausgabe.
Jetzt noch mal eine Frage: Soll das F in deinem Programm überhaupt ausgegeben werden?
-
Nein Nein. Wie ich von Anfang an sagte.
Es sollen nur Ganzzahlige Zahlen akzeptiert werden.
Einträge wie 1234F oder F12345 oder 123F1234 sollen nicht akzeptiert werden.
Darum gings halt.
-
Dann lies eine ganze Zeile in ein char - Array ein, und prüfe den Inhalt auf Ziffern.
-
Belli schrieb:
Dann lies eine ganze Zeile in ein char - Array ein, und prüfe den Inhalt auf Ziffern.
Diesen Vorschlag hatte ich bereits auf Seite 1 gegeben. Erstaunlich, dass er offenbar ignoriert wurde und 3 weitere Seiten folgten.
-
berniebutt schrieb:
Belli schrieb:
Dann lies eine ganze Zeile in ein char - Array ein, und prüfe den Inhalt auf Ziffern.
Diesen Vorschlag hatte ich bereits auf Seite 1 gegeben. Erstaunlich, dass er offenbar ignoriert wurde und 3 weitere Seiten folgten.
Ich weiß nicht, wie ich das mache.
-
Gut, war auf Seite 2:
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.
-
if((1==scanf("\n%i",&b)) || (getchar()==10))
Die Lösung hier habe ich mir gerade zusammengereimt, und funktioniert irgendwie.
So richtig gefallen tut mir die Lösung zwar nicht aber sie geht (bis jetzt jedenfalls)Das
(1==scanf("\n%i",&b)
akzeptiert alle Eingaben die mit einer Zahl beginnen.
Wieso auch immer nimmt er dort nur die Zahl heraus, die restlichen glieder
greift dann (warum auch immer^^) das getchar auf, und wenn dieser gleich 10 ist (das war bei mir der Fall wenn der User NUR Zahlen eingegeben hat) ist alles korrekt.
So zumindest konnte ich jetzt Eingaben durchlassen die wirklich nur Zahlen beinhalten. Sprich bei Eingaben wie TEST123TEST und 123TEST werden nicht zugelassen, sondern nur pure Zahleneinträge wie 123.Hier im Forum bei den Antworten meinte jemand, dass bei Eingabe einer Zahl ohne weitere Sonderzeichen und Buchstaben man am Ende ein '\n' abfangen kann. Jedoch spuckt der bei mir statt eines '\n' eine 10 aus. Wieso ist das so? (Das habe ich nicht verstanden, warum da jetzt 10 herauskommt bei Eingabe von NUR ZAHLEN)
Ist der Code oben OK so, oder könnte ich das anders machen?
-
http://www.c-plusplus.net/forum/p2184737#2184737
demonstriert, wie man mit scanf float-Werte bei der Eingabe prüft ohne Überlauf/Unterlaufprüfung.
-
BunterVogel schrieb:
Hier im Forum bei den Antworten meinte jemand, dass bei Eingabe einer Zahl ohne weitere Sonderzeichen und Buchstaben man am Ende ein '\n' abfangen kann. Jedoch spuckt der bei mir statt eines '\n' eine 10 aus. Wieso ist das so? (Das habe ich nicht verstanden, warum da jetzt 10 herauskommt bei Eingabe von NUR ZAHLEN)
Schreib doch statt der 10 einfach mal '\n' und probier es aus.
Oder mach mal spasseshalberprintf("Der Code von \\n ist %d\n", '\n');
Dann machst du dich noch über ASCII schlau, z.B. in der Wikipedia: http://de.wikipedia.org/wiki/Ascii
Dies "warum auch immer" habe ich aber schon erklärt.