Ganzzahl aus einem String auslesen



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