Format bzw. datentyp in variablen oder eingaben prüfen
-
Ich häng mal wieder....
Ich möchte mein Programm möglichst komplett schreiben, also für den Fall von Falscheingaben entsprechende Meldungen ausgeben.
Vom prinzip her alles noch ganz simpel gehalten.
Ich bin derzeit bei der Eingabe von Zahlen.
Für den Fall, dass statt einer Zahl irgendwas falsches z.B.: Buchstaben eingegeben werden, soll ne Fehlermeldung mit erneuter eingabe folgen.An sich soweit klar, wie das aufzubauen ist, nur wie kann ich den Inhalt einer Variable oder bereits die Eingabe am scanf auf richtigkeit prüfen?
Also soll an scanf nur Zahlen weitergegeben werden. später möchte ich das erweitern, für den Fall dass eine eine bestimmter Zahlentyp erwartet wird.
Beispielsweise Binärzahlen, dass ein Fehler kommt wenn was anderes als 0 und 1 geschrieben wird.Unter anderen scriptsprachen gibts ja nette Hilfe, aber wie mach ich sowas unter C ?
-
Ich würde immer einen kompletten string einlesen und
dann pruefen, ob die Einzelchar >= 0 und <= 9 sind.
Wenn noch Dezimalpunkt oder so gewünscht, auch den noch
prüfen - dabei aber darauf achten, daß nur einer vorkommen
kann, sollte. Ich glaub, es gibt auch so was wie isnum()...
So wie oben geschildert, mach ich das immer im S/370-Assembler.
-
Ok, die variante könnte ich mal angehen, falls da jemand ne Idee hat, wie man sich das einfach gestallten könnte, wäre ich dankbar.
Weil ich jetz noch nicht wirklich weiß, wie ich mir in C eine mehrstellige Zahl Zeichen für Zeichen prüfen könnte.
-
ZSchneidi schrieb:
Ok, die variante könnte ich mal angehen, falls da jemand ne Idee hat, wie man sich das einfach gestallten könnte, wäre ich dankbar.
Weil ich jetz noch nicht wirklich weiß, wie ich mir in C eine mehrstellige Zahl Zeichen für Zeichen prüfen könnte.Eine mehrstellige Zahl kannst du sowieso nicht prüfen, da dann das Kind schon in den Brunnen gefallen ist, du mußt definitiv einen String einlesen und überprüfen. Ich bastel mir da immer was selbst:
Zahl = 0; wiederhole bis Ende erreicht wenn Zeichen eine Ziffer dann Zahl = Zahl * 10 + Ziffer; sonst Fehlermeldung
Bei Kommazahlen muss man das Schema natürlich noch erweitern.
-
Oh mein Gott, lässt sich das nicht einfacher überprüfen, das wegen solch einer kleinen Sache ?
Hmm ok, könntest du mir das an nem kleinen Beispiel etwas genauer zeigen, da ich damit noch nicht viel anfangen kann.
-
Vorgehensweise bei "1234":
zahl=0
0 * 10 + 1 = 1
1 * 10 + 2 = 12
12 * 10 + 3 = 123
123 * 10 + 4 = 1234
Fertig.
Vorgehensweise bei "12h":
zahl=0
0 * 10 + 1 = 1
1 * 10 + 2 = 12
"h" keine Ziffer => Fehlermeldung (oder Eingabe der Zahl beendet)
-
Ich würde zunächst alles in einen String einlesen und den dann mit sscanf zerlegen. Wenn der Rückgabewert von sscanf nicht der Anzahl der zu parsenden Variablen entspricht, stimmt etwas (tm) nicht.
int gefunden; float zahl; do { char zeile[500]; fgets(zeile, sizeof(zeile), stdin); /* Fehlerüberprüfung fehlt hier! */ gefunden = sscanf(zeile, "%f", &zahl); } while (gefunden != 1 /* Anzahl der in sscanf zu parsenden Variablen */);
-
Hm ja das System is soweit klar. Aber so ganz angewandt bekomm ich das noch nicht.
Ich hab in die eingegebene Zahl in ne Variable geschrieben, die sagst du kann ich nicht mehr prüfen...
Also müsste ich mir jetz nen array anlegen und dass zeichenweise kontrollieren ?
Und mit was für ner Anweisung check ich ob etwas eine Ziffer ist ?
Da hab ich die Syntax noch nicht drauf, wie sowas geht.@ LordJaxom
Das hab ich jetz nich wirklich kappiert, ich bin noch n ziemlicher Neuling, deswegen kann ich sowas vielleicht zur Hälfte mal lesen ganz zu schweigen vom Verstehen.
-
ZSchneidi schrieb:
@ LordJaxom
Das hab ich jetz nich wirklich kappiert, ich bin noch n ziemlicher Neuling, deswegen kann ich sowas vielleicht zur Hälfte mal lesen ganz zu schweigen vom Verstehen.Ich kommentiere es mal:
int gefunden; // Indikator, der anzeigt, wieviele Werte gelesen werden konnten float zahl; // Hier steht später die korrekt eingegebene Zahl drin do { char zeile[500]; // Puffer für eine Zeile, in die der Benutzer etwas eingeben kann fgets(zeile, sizeof zeile, stdin); // Funktion: "Lies von Tastatur (stdin) soviele Zeichen, wie 'zeile' fassen kann (sizeof zeile), in die Variable 'zeile' ein" gefunden = sscanf(zeile, "%f", &zahl); // Funktion: "Lies von Variable 'zeile' eine Float-Zahl in 'zahl' ein, und speichere die Anzahl der gelesenen Werte in 'gefunden'" } while (gefunden != 1); // Und das ganze so lange, bis genau ein Wert gelesen werden konnte (oder in C-Sprech: solange (while) nicht genau ein Wert gelesen werden konnte).
Das hat zwar noch den Nachteil, dass nach der Zahl noch Schrott stehen darf (der Benutzer könnte z.B. "-10.34hallo" eingeben, und zahl wäre anschließend -10.34). Das kann man z.B. hiermit unterbinden (die Interpretation des Format-Strings überlasse ich dem geneigten Leser):
sscanf(zeile, "%f%*[^\n]", &zahl);
-
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int Zahl=0,i; char Text[6]; printf("Eingabe:"); scanf("%s",&Text); for (i=0; i<strlen(Text);i++) { if ((Text[i]>=48) && (Text[i]<=57)) Zahl = Zahl *10 + Text[i]-48; //0 entspricht ASCII-Wert 48; 1 -> 49; ... else { printf("Fehler"); return 1; } } printf("Die Zahl war: %d", Zahl); return 0; }
-
Ich bin begeistert Korhil dank dir, das war sogar noch verständlich.
Ich habs grad getestet und in mein ablauf integriert und das scheint das zu sein, was ich wollte. Auch wenns umständlich is, aber wenigstens noch logisch nachvollziehbar.LordJaxom
Dir sei auch gedankt, auch wenn ich deinen Ansatz nicht ganz verstehe, dafür bin ich wohl noch zu neu in der Materie, aber irgendwann werd ich auch sowas noch verstehen lernen
-
Eines stört mich jetz aber noch.
Im Beispiel von Korhil gibt mir das Programm in der for Schleife für jede Falsche eingabe einmal Fehler aus.Wie kann ich das jetz auf eine Fehlerausgabe reduzieren, unabhängig von der Anzahl eingegebener Buchstaben?
-
ZSchneidi schrieb:
Eines stört mich jetz aber noch.
Im Beispiel von Korhil gibt mir das Programm in der for Schleife für jede Falsche eingabe einmal Fehler aus.Wie kann ich das jetz auf eine Fehlerausgabe reduzieren, unabhängig von der Anzahl eingegebener Buchstaben?
Mein Programm war nur ein Beispiel, und hier wird auch nur einmal der Fehler ausgegeben (also nicht jedes mal) und dann das Programm mit return beendet.