la risposta è semplice da usare strtoul()
invece.
La risposta più lunga è che anche se tutto ciò di cui si ha bisogno è stato firmato con numeri interi a 32 bit o contento di 31 bit per non firmato, la funzione atoi()
è inadatta per ciò che si sta facendo.
Come già notato, la funzione atoi()
converte una stringa in un numero intero. Un numero intero normale e firmato. Tuttavia, quello che atoi()
non fa do è la gestione degli errori. Che atoi()
's specifiche dicono è 'Se il valore non può essere rappresentato, il comportamento è indefinito.'
Lo strto *() famiglia di tutte le funzioni di specificare chiaramente come gli errori vengono gestiti, quindi è necessario in tutti i casi, sostituire atoi()
con chiamate a strtol()
(conversione stringa a lunga), e in questo caso poiché si desidera gestire numeri interi senza segno, è necessario utilizzare strtoul()
(convertire la stringa in unsigned long).
Si noti inoltre che se si desidera gestire numeri più grandi, ci sono le funzioni strtoll()
e strtoull()
, per convertire la stringa in una lunga lunga o una lunga non firmata. (E se si desidera solo per gestire i più grandi valori integrali possibili senza preoccuparsi con tutta quella roba in mezzo, c'è strtoimax()
e strtoumax()
, che i valori di ritorno di tipo intmax_t
o uintmax_t
rispettivamente.)
POSIX Documentazione:
fonte
2014-12-03 17:58:37
'atoll'? Non sono sicuro che sia una funzione C standard. – mukunda
Se il codice richiede almeno 16 bit senza segno, utilizzare 'unsigned'. Se il codice ha bisogno di almeno 32 bit senza segno, usa 'unsigned long'. Se il codice necessita di unsigned a 32 bit, usa 'uint32_t'. – chux