Datentyp testen, brauche Hilfe!
-
Hallo,
ich habe folgendes Problem: Ich möchte eine beliebig lange Zahl einlesen und testen ob dies korrekt erfolgt ist, und nicht z.B 123abc45 eingegeben wurde. Dann soll ein Fehler ausgegeben und die Eingabe wiederholt werden. Dazu habe ich folgenden Link gefunden:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-223660.html
Ich habe das so noch nicht probiert, weil es doch eigentlich mit der Bibliothek ctype.h einfacher gehen müsste?!
* int isalnum(int c) testet auf alphanumerisches Zeichen (a-z, A-Z, 0-9) * int isalpha(int c) testet auf Buchstabe (a-z, A-Z) * int iscntrl(int c) testet auf Steuerzeichen (\f, \n, \t ...) * int isdigit(int c) testet auf Dezimalziffer (0-9) * int isgraph(int c) testet auf druckbare Zeichen ohne Leerzeichen * int islower(int c) testet auf Kleinbuchstaben (a-z) * int isprint(int c) testet auf druckbare Zeichen mit Leerzeichen * int ispunct(int c) testet auf druckbare Interpunktionszeichen * int isspace(int c) testet auf Zwischenraumzeichen (Leerzeichen, \f, \n, \t ...) * int isupper(int c) testet auf Grossbuchstaben (A-Z) * int isxdigit(int c) testet auf hexadezimale Ziffern (0-9, a-f, A-F) * int isblank(int c) testet auf Leerzeichen
Meine Beispielfunktion:
unsigned ZahlE(unsigned *Zahl) { printf("\nZahl eingeben: "); if( isalpha(scanf("%u",Zahl)) == 0) { printf("\nFehler in der Eingabe!\n"); return 0; } cb(); //Funktion um Puffer zu leeren return; } int main(void) { unsigned Zahl = 0; ZahlE(&Zahl); return 0; }
Das ist die etwas vereinfachte Funktion. Wenn ich jetzt eine zahl eingebe, wird meine Fehlermeldung ausgegeben, allerdings fährt er im Programm ohne weiteres fort. Wenn ich als erstes einen Buchstaben eingebe, z.B. a123 dann bricht er mit Fehler ab (so wie gewollt). Wenn ich 3a23 eingebe wird nur die 3 registriert, der Rest abgeschnitten. Verwende ich die Funktion isalpha falsch? Wie kann ich am effektivsten Eingaben auf den korrekten Datentyp testen lassen?
Vielen Dank im voraus!
-
Verwende ich die Funktion isalpha falsch?
Ja!
Schau mal, was man: scanf zurück gibt und was man: isalpha erwartet.
-
hmm, also ich denk mir grad folgendes:
isalpha erwartet ein integer c und gibt ein integer als Rückgabewert. scanf liest ein unsigned int ein und speichert es an der Adresse von Zahl, hat als Rückgabewert dann aber die Anzahl der eingelesenen Werte, welcher immer != 0 ist. Liegt es daran?
-
Nur so nebenbei: die Anzahl der eingelesenen Werte bei scanf kann natürlich auch 0 sein.
-
man: isalpha erwartet aber ein Zeichen als Parameter! man: scanf gibt dir die Anzahl der Eingelesenen Werte zurück (was auch 0 sein kann). Aber kein Zeichen! Das geht also nicht zusammen!
-
@ _matze ja, natürlich hast du recht, war unglücklich von mir formuliert
kann ich die Funktionen aus ctype also nur wirklich verwenden wenn ich ein charakter einlesen will?! Bzw. wie müsste ich das umstrukturieren, weil irgendwie hab ich immer einen typecast drin...
-
Funktionen wie isalpha können natürlich auch in einer Schleife über einen kompletten String laufen...
chmbw schrieb:
Ich möchte eine beliebig lange Zahl einlesen und testen ob dies korrekt erfolgt ist, und nicht z.B 123abc45 eingegeben wurde.
Wenn du mit scanf eine Zahl (z.B. unsigned int) einlesen willst und der Benutzer 123abc45 eingibt, dann wird scanf die "123" konvertieren und in deiner Variable speichern, 1 zurückgeben und somit Erfolg signalisieren (es wurden ja auch alle geforderten Variablen eingelesen). Der Rest des eingegebenen Strings wurde dann gar nicht von dir registriert. Wenn du also genau so eine Eingabe als Fehler werten willst, lies besser einen String ein und überprüfe alle Zeichen auf Gültigkeit. Deine Zahl kannst du im Anschluss dann mit sscanf aus dem String ziehen (sofern deine Prüfung erfolgreich war).
-
hmm, alles klar. sprich ich wurschtel mich durch diesen http://www.c-plusplus.net/forum/viewtopic-var-t-is-223660.html Link. Um Strings kommt man gar nicht drum herum?!
herzlichen Dank für eure schnelle Hilfe!!!