J'essaie de savoir s'il existe un autre moyen de convertir une chaîne de caractères en nombre entier en C.
J'ai régulièrement le modèle suivant dans mon code.
char s[] = "45";
int num = atoi(s);
Existe-t-il une meilleure méthode ou une autre méthode ?
Il y a [strtol
][1] qui est meilleur IMO. J'ai aussi pris goût à [strtonum
][2], alors utilisez-le si vous l'avez (mais souvenez-vous qu'il n'est pas portable) :
long long
strtonum(const char *nptr, long long minval, long long maxval,
const char **errstr);
Vous pourriez aussi être intéressé par [strtoumax
et strtoimax
][3] qui sont des fonctions standard en C99. Par exemple, vous pourriez dire :
uintmax_t num = strtoumax(s, NULL, 10);
if (num == UINTMAX_MAX && errno == ERANGE)
/* Could not convert. */
Quoi qu'il en soit, restez loin de atoi
:
L'appel atoi(str) est équivalent à :
(int) strtol(str, (char **)NULL, 10)
sauf que le traitement des erreurs peut différer. Si la valeur ne peut pas être représentée, le comportement est indéfini.
[1] : http://en.cppreference.com/w/c/string/byte/strtol [2] : http://www.freebsd.org/cgi/man.cgi?query=strtonum [3] : http://en.cppreference.com/w/c/string/byte/strtoimax
N'utilisez pas les fonctions du groupe ato...
. Elles sont cassées et pratiquement inutiles. Une solution modérément meilleure serait d'utiliser sscanf
, bien qu'elle ne soit pas parfaite non plus.
Pour convertir une chaîne en entier, les fonctions du groupe strto...
devraient être utilisées. Dans votre cas spécifique, ce serait la fonction strtol
.