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/Ascii

    Vom 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/Ascii

    Vom 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


Anmelden zum Antworten