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.
-
strtol
unterstützt eine Rückgabe einesend
-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 einesend
-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 demreturn
sind nicht nötig). Der einzige Fall, der da noch durchfällt, ist der, dassstr
auf einen leeren String (ein Nullbyte) zeigt.