Kuinka muuntaa merkkijono kokonaisluvuksi C:ssä?

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?

Ratkaisu

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);

EDIT

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ä.

Kommentit (7)

Ä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.

Kommentit (3)

Kyllä, voit tallentaa kokonaisluvun suoraan:

int num = 45;

Jos sinun täytyy jäsentää merkkijono, atoi tai strol voittaa "lyhin määrä koodia" -kilpailun.

Kommentit (2)