Ganzzahl aus einem String auslesen
-
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> int main(void) { char String[] = "Hallo ihr 2"; int n; n = strlen(String); printf("String-Laenge: %i\n",n); int x, i; for(i = 0; i<=n; i++) { x = (isdigit((int)String[i])); if(x==4) { printf("%i", String[i]); } } getchar(); return(0); }
Warum wird bei Zeile 23 nicht die aktuelle >>Stringstelle<< ausgegeben?
-
Wenn du wissen willst, WO im String du was auch immer gefunden hast, solltest du
printf("%i", i);
nutzen. Wenn du wissen willst, WAS dort steht:
printf("%c", String[i]);
Was genau hast du eigentlich in Zeile 20 vor? Ich vermute mal, dass isdigit() eine im String stehende Zahl erkennen soll, da würdest du bei deinem Beispiel bestenfalls eine 2 finden. Also ist deine if-Abfrage niemals wahr.
EDIT: Ja, isdigit scheint dir eine Zahl zu suchen. Nun übergibst du dieser Funktion aber einen Integer, keinen char. Isdigit wird sich nichts daraus machen und den int wieder in einen Char konvertieren, aber die Aktion kannst du dir trotzdem sparen.
-
Stiefel2000 schrieb:
EDIT: Ja, isdigit scheint dir eine Zahl zu suchen. Nun übergibst du dieser Funktion aber einen Integer, keinen char. Isdigit wird sich nichts daraus machen und den int wieder in einen Char konvertieren, aber die Aktion kannst du dir trotzdem sparen.
Also erstens entschuldige ich mich für meine Unkonkretheit.
Beim nächstes mal werde ich darauf achten!So nun zum Thema, mein Denkfehler war es, dass ich naiv annahm int würde in ein char konvertiert. Stimmts? Wäre ein Cast hierbei hilfreich?
Edit: *umgekeht char zu int
-
Du hast schon recht, wenn du glaubst, dass ein char (wenn nötig) in einen Int konvertiert wird. Schließlich kannst du auch mit chars "rechnen":
char a='a' , b='b'; int i=a+b;
Aber das wird dir bei deinem Problem vermutlich nicht helfen, ich wollte dich nur darauf hinweisen, dass du dir den expliziten Cast sparen kannst, da isdigit ohnehin einen char erwartet.
Ansonsten versuch doch malif(x==2) { printf("Zeichen %c an Stelle %i\n" , String[i] , i); printf("%i", String[i]); }
Vielleicht führt das ja zum Erfolg, immerhin ist in deinem String keine 4 vorhanden.
-
Stiefel2000 schrieb:
Vielleicht führt das ja zum Erfolg, immerhin ist in deinem String keine 4 vorhanden.
isdigit bzw. x liefert aber den Wert 4! 4 Bytes => Integer
Oder etwa nicht?
-
Ich muss gestehen, dass ich die Funktion noch nie benutzt habe. Allerdings würde ich erwarten, dass die Funktion einen char aufnimmt (z.B. "5") und einen int zurückgibt (5). Warum sollte sie dir denn die Länge eines ints zurückgeben?
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 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