Le fichier en-tête stdlib.h contient des déclarations de
fonctions permettant la conversion de données de type chaîne de caractères
en données numériques :
- double atof(const char *s) convertit l'argument s
en un double,
- int atoi(const char *s) convertit l'argument s
en un int,
- long atol(const char *s) convertit l'argument s
en un long,
- double strtod(const char *s, char **endp) convertit
le début de l'argument s en un double, en ignorant
les éventuels caractères d'espacement situés en-tête. Elle place dans
l'argument endp l'adresse de la partie non convertie de s,
si elle existe, sauf si endp vaut NULL. Si la valeur
convertie est trop grande, la fonction retourne la pseudo-constante
HUGE_VAL définie dans le fichier en-tête math.h,
si elle est trop petite la valeur retournée est 0,
- long strtol(const char *s, char **endp, int base) convertit
le début de l'argument s en un long avec un traitement
analogue à strtod. L'argument base permet d'indiquer
la base (comprise entre 2 et 36) dans laquelle le
nombre à convertir est écrit. Si base vaut 0, la base
considérée est 8, 10 ou 16 :
- un 0 en tête indique le format octal,
- les caractères 0x ou 0X en tête indique le format
hexadécimal.
Si la valeur retournée est trop grande, la fonction retourne les pseudo-constantes
LONG_MAX ou LONG_MIN suivant le signe du résultat,
- unsigned long strtoul(const char *s, char **endp, int
base) est équivalente à strtol mis à part que le résultat
est de type unsigned long, et que la valeur de retour, en cas
d'erreur, est la pseudo-constante ULONG_MAX définie dans
le fichier en-tête limits.h.
Exemple
#include <stdio.h>
#include <stdlib.h>
main()
{
char *s = " 37.657a54";
char *cerr;
printf("%f\n", strtod(s, &cerr)); ===> 37.657
if (*cerr != '\0')
fprintf(stderr,
"Caractere errone : %c\n", *cerr);
s = "11001110101110";
printf("%ld\n", strtol(s, NULL, 2)); ===> 13230
s = "0x7fff";
printf("%ld\n", strtol(s, NULL, 0)); ===> 32767
s = "0777";
printf("%ld\n", strtol(s, NULL, 0)); ===> 511
s = "777";
printf("%ld\n", strtol(s, NULL, 0)); ===> 777
}
Pr. Marc BUFFAT
buffat@ufrmeca.univ-lyon1.fr
2004-12-01