Yritän selvittää, onko olemassa vaihtoehtoista tapaa muuntaa merkkijono kokonaisluvuksi C:ssä.
Koodissani on säännöllisesti seuraava malli.
char s[] = "45";
int num = atoi(s);
Onko siis olemassa parempaa tapaa tai muuta tapaa?
On olemassa strtol
, joka on IMO parempi. Olen myös tykästynyt strtonum
, joten käytä sitä, jos sinulla on se (mutta muista, että se ei ole siirrettävissä):
long long
strtonum(const char *nptr, long long minval, long long maxval,
const char **errstr);
Saatat olla kiinnostunut myös strtoumax
ja strtoimax
, jotka ovat C99:n standardifunktioita. Voit esimerkiksi sanoa:
uintmax_t num = strtoumax(s, NULL, 10);
if (num == UINTMAX_MAX && errno == ERANGE)
/* Could not convert. */
Joka tapauksessa, pysy kaukana atoi
:sta:
Kutsu atoi(str) vastaa:
(int) strtol(str, (char **)NULL, 10)
paitsi että virheiden käsittely voi olla erilainen. Jos arvo ei voi olla esittää, käyttäytyminen on määrittelemätöntä.
Älä käytä ato...
-ryhmän funktioita. Ne ovat rikki ja käytännössä hyödyttömiä. Kohtalaisen parempi ratkaisu olisi käyttää sscanf
, vaikka sekään ei ole täydellinen.
Jos haluat muuntaa merkkijonon kokonaisluvuksi, tulisi käyttää strto...
-ryhmän funktioita. Sinun tapauksessasi se olisi strtol
-funktio.