12.4.2 Lecture formatée dans une chaîne avec sscanf (utilité : ***)

Icône de l'outil pédagogique Lecture formatée dans une chaîne avec sscanf (utilité : ***)

Quand on dispose d'une phrase lue par gets, on peut y lire des informations par la fonction sscanf. Elle fonctionne exactement comme scanf, sauf que le "flux d'entrée" est une chaîne de caractères au lieu d'être le tampon du Langage C.

Exemple 74 : Utilisation de sscanf pour extraire des données d’un texte

Pour pouvoir utiliser sscanf dans de bonnes conditions (sans rendre la lecture difficile, comme ci-dessous), il faut s’imposer un format bien choisi (simple) pour les données à lire.
Par exemple, on peut facilement extraire les 3 informations soulignées (nom, age et salaire) d'une chaîne phrase choisie de la forme « Sophie 20 ans 1000 euros ». Ce format, simple, permet de faire la lecture avec seulement 4 codes formats (dont un %*s pour sauter une information non utile) :

nb_val_lues = sscanf( phrase, "%s%hd%*s%lf", nom, &age, &salaire) ; // %*s sert à sauter « ans »
if (nb_val_lues != 3) printf ("problème de lecture") ;

Le code %*s permet de "sauter" un mot non significatif qu'on ne souhaite pas mémoriser (on l’utilise pour
toutes les parties du texte qui ne sont pas à mémoriser) :

Voici un exemple de format mal choisi : la chaîne phrase est de la forme "Sophie (20 ans) gagne 1000.00 E par mois" ou "Max (30 ans) gagne 1650.00 E par mois". Ce format contient trop de caractères inutiles et il est difficile à lire. Il faut en effet écrire :

nb_val_lues = sscanf( phrase, "%s (%hd ans) gagne %lf", nom, &age, &salaire) ;

On peut aussi utiliser le code %*s qui permet de "sauter" un mot non significatif :

nb_val_lues =sscanf( phrase, "%s (%hd%*s%*s%lf", nom, &age, &salaire) ;

/* les codes format %*s permettent de sauter les deux sous‐chaînes « ans) » et « gagne » */

La manipulation de sscanf, comme celle de scanf, est délicate. En particulier, tout caractère qui figure dans les guillemets en compagnie des codes formats (%xx) doit impérativement figurer dans la chaîne à lire. Dans notre exemple, le texte entre %s et %hd (espace puis parenthèses) doit figurer tel qu’il est écrit dans la chaîne à lire.