© Éditions Eyrolles
151
chapitre n° 8
Les chaînes de caractères
Nous nous sommes limité ici aux entrées-sorties conversationnelles. Les autres possibilités
seront examinées dans le chapitre consacré aux fichiers.
Si, dans notre précédent programme, l’utilisateur introduit une fin de ligne entre le nom et le
prénom, la chaîne affectée à prenom n’est rien d’autre que la chaîne vide ! Ceci provient de ce
que la fin de ligne servant de délimiteur pour le premier %s n’est pas consommée et se trouve
donc reprise par le %s suivant...
Étant donné que gets consomme la fin de ligne servant de délimiteur, alors que le code %s de
scanf ne le fait pas, il n’est guère possible, dans le programme précédent, d’inverser les utilisations de scanf et de gets (en lisant la ville par scanf puis le nom et le prénom par gets) :
dans ce cas, la fin de ligne non consommée par scanf amènerait gets à introduire une chaîne
vide comme nom. D’une manière générale, d’ailleurs, il est préférable, autant que possible, de
faire appel à gets plutôt qu’au code %s pour lire des chaînes.
3 Pour fiabiliser la lecture au clavier :
le couple gets sscanf
Nous avons vu, dans le chapitre concernant les entrées-sorties conversationnelles, les problèmes posés par scanf en cas de réponse incorrecte de la part de l’utilisateur.
Il est possible de régler la plupart de ces problèmes en travaillant en deux temps :
●
lecture d’une chaîne de caractères par gets (c’est-à-dire d’une suite de caractères quelconques validés par « return ») ;
●
décodage de cette chaîne suivant un format, à l’aide de la fonction sscanf. En effet, une
instruction telle que :
sscanf (adresse, format, liste_variables)
effectue sur l’emplacement dont on lui fournit l’adresse (premier argument de type char *)
le même travail que scanf effectue sur son tampon. La différence est qu’ici nous sommes
maître de ce tampon ; en particulier, nous pouvons décider d’appeler à nouveau sscanf sur
une nouvelle zone de notre choix (ou sur la même zone dont nous avons modifié le contenu
par gets), sans être tributaire de la position du pointeur, comme cela était le cas avec scanf.
Delannoy Livre.book Page 151 Mercredi, 6. mai 2009 4:26 16
151
chapitre n° 8
Les chaînes de caractères
Nous nous sommes limité ici aux entrées-sorties conversationnelles. Les autres possibilités
seront examinées dans le chapitre consacré aux fichiers.
Si, dans notre précédent programme, l’utilisateur introduit une fin de ligne entre le nom et le
prénom, la chaîne affectée à prenom n’est rien d’autre que la chaîne vide ! Ceci provient de ce
que la fin de ligne servant de délimiteur pour le premier %s n’est pas consommée et se trouve
donc reprise par le %s suivant...
Étant donné que gets consomme la fin de ligne servant de délimiteur, alors que le code %s de
scanf ne le fait pas, il n’est guère possible, dans le programme précédent, d’inverser les utilisations de scanf et de gets (en lisant la ville par scanf puis le nom et le prénom par gets) :
dans ce cas, la fin de ligne non consommée par scanf amènerait gets à introduire une chaîne
vide comme nom. D’une manière générale, d’ailleurs, il est préférable, autant que possible, de
faire appel à gets plutôt qu’au code %s pour lire des chaînes.
3 Pour fiabiliser la lecture au clavier :
le couple gets sscanf
Nous avons vu, dans le chapitre concernant les entrées-sorties conversationnelles, les problèmes posés par scanf en cas de réponse incorrecte de la part de l’utilisateur.
Il est possible de régler la plupart de ces problèmes en travaillant en deux temps :
●
lecture d’une chaîne de caractères par gets (c’est-à-dire d’une suite de caractères quelconques validés par « return ») ;
●
décodage de cette chaîne suivant un format, à l’aide de la fonction sscanf. En effet, une
instruction telle que :
sscanf (adresse, format, liste_variables)
effectue sur l’emplacement dont on lui fournit l’adresse (premier argument de type char *)
le même travail que scanf effectue sur son tampon. La différence est qu’ici nous sommes
maître de ce tampon ; en particulier, nous pouvons décider d’appeler à nouveau sscanf sur
une nouvelle zone de notre choix (ou sur la même zone dont nous avons modifié le contenu
par gets), sans être tributaire de la position du pointeur, comme cela était le cas avec scanf.
Delannoy Livre.book Page 151 Mercredi, 6. mai 2009 4:26 16
