C'de bir dizeyi tam sayıya nasıl dönüştürebilirim?

C'de dizeyi tamsayıya dönüştürmenin alternatif bir yolu olup olmadığını öğrenmeye çalışıyorum.

Kodumda düzenli olarak aşağıdaki örüntüyü kullanıyorum.

char s[] = "45";

int num = atoi(s);

Peki, daha iyi bir yol ya da başka bir yol var mı?

Çözüm

IMO'ya göre daha iyi olan strtol vardır. Ayrıca strtonum'den de hoşlanıyorum, eğer varsa onu kullanın (ancak taşınabilir olmadığını unutmayın):

long long
     strtonum(const char *nptr, long long minval, long long maxval,
     const char **errstr);

EDIT

C99'da standart fonksiyonlar olan strtoumax ve strtoimax da ilginizi çekebilir. Örneğin şöyle diyebilirsiniz:

uintmax_t num = strtoumax(s, NULL, 10);
if (num == UINTMAX_MAX && errno == ERANGE)
    /* Could not convert. */

Her neyse, "atoi "den uzak durun:

atoi(str) çağrısı şuna eşdeğer olacaktır:

(int) strtol(str, (char **)NULL, 10)

ancak hataların işlenmesi farklılık gösterebilir. Eğer değer temsil edildiğinde, davranış tanımsızdır.

Yorumlar (7)

ato...grubundaki işlevleri kullanmayın. Bunlar bozuk ve neredeyse işe yaramaz. Mükemmel olmasa dasscanf` kullanmak kısmen daha iyi bir çözüm olacaktır.

Dizeyi tamsayıya dönüştürmek için strto... grubundaki fonksiyonlar kullanılmalıdır. Sizin özel durumunuzda bu strtol fonksiyonu olacaktır.

Yorumlar (3)

Evet, tamsayıyı doğrudan saklayabilirsiniz:

int num = 45;

Bir dizeyi ayrıştırmanız gerekiyorsa, atoi veya strol "en kısa kod miktarı" yarışmasını kazanacaktır.

Yorumlar (2)