Ganzzahl aus einem String auslesen
-
Stiefel2000 schrieb:
... ich wollte dich nur darauf hinweisen, dass du dir den expliziten Cast sparen kannst, da isdigit ohnehin einen char erwartet.
nö, int.
-
flash!, du hast Recht. Danke für den Hinweis, ich habe in der Dokumentation das "c" gesehen und auf char geschaltet. Allerdings ist c ein int gewesen :). Den Cast könnte man sich trotzdem sparen :P.
-
Stiefel2000 schrieb:
EDIT: Falls dir isdigit nur einen Wahrheitswert liefert, probier doch mal das:
for(i = 0; i<=n; i++) { if(isdigit(String[i])) { printf("Zahl %c an %i gefunden.", String[i] , i + 1); } }
Stiefel2000 dein Beispiel funktioniert
-
Sorry wegen dem DP!
Aber mir ist etwas aufgefallen !Könnte man die entsprechende Stringstelle nicht in einen int umwandeln?
-
Meinst du etwa so?
printf("Zahl %i an %i gefunden.", String[i] , i + 1);
(man beachte das %i anstelle des %c)
Das sollte gehen. Aber wenn du schon soweit bist, kannst du dir diese elende isdigit-Funktion auch gleich vom Hals schaffen, bzw. sie selbst schreiben
(das sollten höchstens 5 oder 6 Zeilen sein). Dann weißt du zumindest ganz sicher, was du zurückbekommst und warum.
-
Stiefel2000 schrieb:
Meinst du etwa so?
printf("Zahl %i an %i gefunden.", String[i] , i + 1);
(man beachte das %i anstelle des %c)
Das sollte gehen.
Kommt aber 50 und nicht Zwei!
Stiefel2000 schrieb:
Aber wenn du schon soweit bist, kannst du dir diese elende isdigit-Funktion auch gleich vom Hals schaffen, bzw. sie selbst schreiben
(das sollten höchstens 5 oder 6 Zeilen sein). Dann weißt du zumindest ganz sicher, was du zurückbekommst und warum.
Skizze parat?
-
Die 50 lässt sich erklären ;):
http://en.wikipedia.org/wiki/AsciiVom ASCII-Code hast du hoffentlich schonmal was gehört.
isdigit übernimmt nun faulerweise einen ASCII-Wert und schaut nur nach, ob sich dahinter eine Zahl verbirgt:int isdigit(char c) { if(c <= 57 && c >= 48) return(1); //es handelte sich um eine Zahl! else return(0); }
Die Funktion sagt jetzt einfach nur "Zahl" oder "keine Zahl", einfache Ergänzung zu einer präziseren Aussage wäre:
int isdigit(char c) { if(c <= 57 && c >= 48) return(c - 48); //deine Zahl wird zurückgegeben else return(-1); }
Wenn du bei letzterer Version eine -1 zurückbekommst, hast du isdigit irgendein Zeichen zur Probe gegeben, das keine Zahl war.
-
Stiefel2000 schrieb:
Die 50 lässt sich erklären ;):
http://en.wikipedia.org/wiki/AsciiVom ASCII-Code hast du hoffentlich schonmal was gehört.
isdigit übernimmt nun faulerweise einen ASCII-Wert und schaut nur nach, ob sich dahinter eine Zahl verbirgt:int isdigit(char c) { if(c <= 57 && c >= 48) return(1); //es handelte sich um eine Zahl! else return(0); }
Wenn du bei letzterer Version eine -1 zurückbekommst, hast du isdigit irgendein Zeichen zur Probe gegeben, das keine Zahl war.
Oder alternativ:
if ((cIn >= '0') && (cIn <= '9'))
-
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> int isdigitx(int c) { if(c <= 57 && c >= 48) return(c - 48); //deine Zahl wird zurückgegeben else return(-1); } int main(void) { char String[] = "Hallo ihr 2"; int n; n = strlen(String); printf("String-Laenge: %i\n",n); int i; for(i = 0; i<=n; i++) { if(isdigit(String[i])) { printf("%i",isdigitx(String[i])); } } getchar(); return(0); }
Ich habe die Stiefel2000 variante gewählt (kleine Modifizierung beim Parameter-Typ) ^^
Endlich klappts, Danke!
-
Die Funktion isdigitx ist überflüssig, mit isdigit fragst du ja bereits ab, ob es eine Ziffer ist.
Du kannst isdigitx weglassen und schreiben:
if(isdigit(String[i]))
printf("%i", String[i]-48 );Beide Varianten versagen jedoch, wenn im String eine Zahl aus mehreren Ziffern vorkommt: "abc 124".
Dafür gibt es strtoul, strtol, etc.MFG