string to int (the ansi way)



  • Hallo zusammen

    gibt es eigentlich einen tollen, einfachen ANSI-konformen Weg einen string in einen Integer umzuwandeln. atoi() strtol() haben alle ein Problem falls im String eine 0 drin steht (d.h. mein weiß nicht ob eine 0 im string steht oder ein nicht konvertiert worden konnte. Manche Implementationen setzten errno entsprechend. Aber das ist leider nicht im Standard drinne).

    Danke schön

    P.S.: Was ham die eigentlich geraucht als sie die C-Library designed haben?



  • sscanf() sollte überall funktionieren.


  • Administrator

    strtol unterstützt eine Rückgabe eines end -Zeigers. Über diesen kannst du kontrollieren ob die zurückgegebene 0 ein Fehler oder ein gültiger Wert ist.

    Grüssli



  • lzm schrieb:

    atoi() strtol() haben alle ein Problem falls im String eine 0 drin steht (d.h. mein weiß nicht ob eine 0 im string steht oder ein nicht konvertiert worden konnte.

    Was für eine 0? Was für ein Problem? Bei atoi() muss man eben schon wissen, was man hineinwirft. Bei strtol() kann man alles über den Endzeiger und die Rückgabe erfahren.

    sscanf() sollte überall funktionieren.

    Klar, und demnächst fliegen wir mit dem Flugzeug zum Bäcker.
    🙂



  • Dravere schrieb:

    strtol unterstützt eine Rückgabe eines end -Zeigers. Über diesen kannst du kontrollieren ob die zurückgegebene 0 ein Fehler oder ein gültiger Wert ist.

    Grüssli

    Ist mir gerade nicht ersichtlich.

    Also

    char * endptr;
    strtol("  0", &endptr, 10);
    

    Zeigt dann auf das Zeichen nach '0' oder? Soll ich dann einfach überprüfen ob *(--endptr) == '0' ist.

    Mein Gott wie hässlich 🙂



  • lzm schrieb:

    char * endptr;
    strtol("  0", &endptr, 10);
    

    Zeigt dann auf das Zeichen nach '0' oder? Soll ich dann einfach überprüfen ob *(--endptr) == '0' ist.

    Die Glaskugel schlägt vor, dass du eher sowas prüfen willst:

    *endptr == 0
    

    lzm schrieb:

    Mein Gott wie hässlich 🙂

    Mein Gott, wie effizient.
    🙂



  • Also

    int strToInt(char * str, int * result)
    {
      char *endptr;
      *result = strtol(str, &endptr, 10);
      return (*endptr == 0);
    }
    

    Ist eine Funktion die nonzero liefert genau dann wenn in str ein gültige Zahl steht und in result steht das Ergebnis?



  • lzm schrieb:

    Also

    int strToInt(char * str, int * result)
    {
      char *endptr;
      *result = strtol(str, &endptr, 10);
      return (*endptr == 0);
    }
    

    Ist eine Funktion die nonzero liefert genau dann wenn in str ein gültige Zahl steht und in result steht das Ergebnis?

    Mit *endptr == 0 siehst du nach, ob strtol() bis zum Ende des Strings konvertiert hat (die Klammern nach dem return sind nicht nötig). Der einzige Fall, der da noch durchfällt, ist der, dass str auf einen leeren String (ein Nullbyte) zeigt.
    🙂


Anmelden zum Antworten