atoi(3)
Fonction de la bibliothèque C
Convertit le début d'une chaîne en int. atoi ne signale aucune erreur : « abc » et « 0 » donnent tous deux 0, et un débordement est un comportement indéfini.
#include <stdlib.h>
int atoi(const char *nptr);Description
atoi lit le début de la chaîne nptr comme un entier en base 10. Elle saute les espaces du début (espace, tabulation, retour à la ligne et les autres blancs de isspace), accepte un signe + ou -, puis lit les chiffres et s'arrête au premier caractère qui n'en est pas un. Le reste de la chaîne est ignoré sans avertissement.
La norme la définit comme équivalente à (int)strtol(nptr, NULL, 10), sauf en cas d'erreur, où elle n'a rien à promettre.
Valeur de retour
L'entier lu. Quand la chaîne ne commence par aucun chiffre, la glibc et musl renvoient 0 ; POSIX laisse cette valeur non spécifiée. Si le nombre ne tient pas dans un int, la norme C dit que le comportement est indéfini. atoi n'est pas obligée de positionner errno, et la page de manuel Linux prévient qu'on ne peut pas compter dessus pour distinguer un 0 d'une erreur.
Pièges
Impossible de distinguer une erreur d'un vrai zéro : atoi("abc") et atoi("0") renvoient la même chose. Pour une saisie utilisateur, c'est rédhibitoire.
Les caractères en trop passent inaperçus : " -17abc" donne -17 comme si la saisie était propre.
Un nombre trop grand n'est pas signalé. Dans l'exemple, "3000000000" dépasse INT_MAX (2 147 483 647) et la glibc renvoie -1294967296, un nombre négatif sorti de nulle part. C'est ce qu'elle fait sur cette machine, pas une garantie : la norme n'en donne aucune.
Seule la base 10 est lue : atoi("0x1A") s'arrête au x et renvoie 0.
La page de manuel Linux recommande strtol(3) dans tout nouveau programme. Elle dit où la lecture s'est arrêtée, signale le dépassement avec errno et accepte d'autres bases. Garde atoi pour des données que tu contrôles, comme une constante dans un fichier que tu as écrit toi-même.
Exemple
#include <stdio.h>#include <stdlib.h>
int main(void){ const char *essais[] = {"42", " -17abc", "abc", "0", "3000000000"};
for (int i = 0; i < 5; i++) printf("atoi(\"%s\") = %d\n", essais[i], atoi(essais[i])); return 0;}$ gcc -Wall -Wextra conversion.c -o conversion$ ./conversionatoi("42") = 42atoi(" -17abc") = -17atoi("abc") = 0atoi("0") = 0atoi("3000000000") = -1294967296Les lignes 3 et 4 sont identiques en sortie alors que l'une est une erreur et l'autre un vrai zéro. La dernière est un débordement que rien ne signale.
atoi
Écris gm_atoi, ton propre atoi, qui saute les blancs du début, accepte un signe facultatif et s'arrête au premier caractère qui n'est pas un chiffre.