Convertir la chaîne en nombre
Notre fonction lire est maintenant efficace et robuste, mais elle ne sait lire que du texte. Vous devez vous demander : « Mais comment fait-on pour récupérer un nombre ? »
En fait, lire est une fonction de base. Avec fgets, vous ne pouvez récupérer que du texte, mais il existe d'autres fonctions qui permettent de convertir ensuite un texte en nombre.
strtol : convertir une chaîne en long
Le prototype de la fonction strtol est un peu particulier :
long strtol( const char *start, char **end, int base ); |
La fonction lit la chaîne de caractères que vous lui envoyez (start) et essaie de la convertir en long en utilisant la base indiquée (généralement, on travaille en base 10 car on utilise 10 chiffres différents de 0 à 9, donc vous mettrez 10). Elle retourne le nombre qu'elle a réussi à lire.
Quant au pointeur de pointeur end, la fonction s'en sert pour renvoyer la position du premier caractère qu'elle a lu et qui n'était pas un nombre. On ne s'en servira pas, on peut donc lui envoyer NULL pour lui faire comprendre qu'on ne veut rien récupérer.
La chaîne doit commencer par un nombre, tout le reste est ignoré. Elle peut être précédée d'espaces.
Quelques exemples d'utilisation pour bien comprendre le principe :
long i;
i = strtol( "148", NULL, 10 ); // i = 148 i = strtol( "148.215", NULL, 10 ); // i = 148 i = strtol( " 148.215", NULL, 10 ); // i = 148 i = strtol( " 148+34", NULL, 10 ); // i = 148 i = strtol( " 148 feuilles mortes", NULL, 10 ); // i = 148 i = strtol( " Il y a 148 feuilles mortes", NULL, 10 ); // i = 0 (erreur : la chaîne ne commence pas par un nombre) |
Toutes les chaînes qui commencent par un nombre (ou éventuellement par des espaces suivis d'un nombre) seront converties en long jusqu'à la première lettre ou au premier caractère invalide (., +, etc.).
La dernière chaîne de la liste ne commençant pas par un nombre, elle ne peut pas être convertie. La fonction strtol renverra donc 0.
On peut créer une fonction lireLong qui va appeler notre première fonction lire (qui lit du texte) et ensuite convertir le texte saisi en nombre :
long lireLong() { char nombreTexte[100] = {0}; // 100 cases devraient suffire
if (lire(nombreTexte, 100)) { // Si lecture du texte ok, convertir le nombre en long et le retourner return strtol(nombreTexte, NULL, 10); } else { // Si problème de lecture, renvoyer 0 return 0; } } |
Vous pouvez tester dans un main très simple :
int main(int argc, char *argv[]) { long age = 0;
printf("Quel est votre age ? "); age = lireLong(); printf("Ah ! Vous avez donc %d ans !\n\n", age);
return 0; } |
Quel est votre age ? 18 Ah ! Vous avez donc 18 ans ! |
strtod : convertir une chaîne en double
La fonction strtod est identique à strtol, à la différence près qu'elle essaie de lire un nombre décimal et renvoie un double :
double strtod( const char *start, char **end ); |
Vous noterez que le troisième paramètre base a disparu ici, mais il y a toujours le pointeur de pointeur end qui ne nous sert à rien.
Contrairement à strtol, la fonction prend cette fois en compte le « point » décimal. Attention, en revanche : elle ne connaît pas la virgule (ça se voit que ça a été codé par des Anglais).
À vous de jouer ! Écrivez la fonction lireDouble. Vous ne devriez avoir aucun mal à le faire, c'est exactement comme lireLong à part que cette fois, on appelle strtod et on retourne un double.
Vous devriez alors pouvoir faire ceci dans la console :
Combien pesez-vous ? 67.4 Ah ! Vous pesez donc 67.400000 kg ! |
Essayez ensuite de modifier votre fonction lireDouble pour qu'elle accepte aussi le symbole virgule comme séparateur décimal. La technique est simple : remplacez la virgule par un point dans la chaîne de texte lue (grâce à la fonction de recherche strchr), puis envoyez la chaîne modifiée à strtod.
Créé avec HelpNDoc Personal Edition: Créer des documentations web iPhone