• Aucun résultat trouvé

Quelques fonctions de traitement de chaînes de caractères

Le Langage C fournit un grand nombre de fonctions de traitement de chaînes : copie, concaténation, recherches d'occurrence, conversion, initialisation .... Ces fonctions sont déclarées dans le fichier en-tête

string.h, qu'il est conseillé de consulter avec l'aide en ligne.

Nous ne rappelons ici que quelques-unes des fonctions les plus utiles. Attention, aucun contrôle de dépassement de la taille des chaînes n'est en général effectué.

Voici un exemple qui sera suivi par la description rapide des fonctions utilisées. UTILISEZ L'AIDE EN LIGNE

POUR PLUS DE DETAILS (fonctionnement, valeur renvoyée, exemples, autres fonctions, ...)

Exemple 70. Utilisation de quelques fonctions de traitement de chaînes

Exemple 71. Fabrication et affichage (sous IDE CVI) de chaînes de caractères

void main(void) {

static char mot1[20]="Hello", mot2[20]="world" ; static char phrase[50] = "" ; /* chaîne vide */

strcpy( phrase, mot1 ); /* copie de la chaîne mot1 dans la chaîne phrase */ strcat( phrase, mot2 ); /* concaténation = « collage » de 2 chaînes */

printf( "%s", strcat(phrase, " !") ); /*concaténation avec une chaîne constante et affichage*/ printf( "\n Cette phrase a %d caractères ", strlen(phrase) ) ;

if ( strcmp(phrase,"Hello")==NULL ) /* comparaison de 2 chaînes */ printf("Elle vaut Hello \n");

if ( strchr(phrase,'a')==NULL ) /* recherche d’un caractère dans une chaîne */ printf("Elle ne contient pas la lettre 'a'");

}

void main(void) {

static char libelle[81]; /* données de l’exemple (initialisées) */

char nom_article[] = "fer à repasser"; short i=24; double prix = 89.99 ; sprintf( libelle," L'article n°%3hd du stock est %s.\n Il vaut %7.2lf euros",

i, nom_article, prix);

MessagePopup("caractéristiques d'un article du stock", libelle ); }

12.4.1 Fabrication d'une chaîne par sprintf (utilité : ***)

Pour l'affichage (en particulier sous interface graphique), on a souvent besoin de fabriquer une chaîne de caractères en assemblant du texte et des valeurs numériques. La fonction sprintf, une des fonctions les plus utiles, fournit un moyen très simple pour y arriver. Elle fonctionne exactement comme printf, sauf que le résultat est stocké dans une chaîne de caractères au lieu d'être affiché à l'écran.

sprintf est une fonction « universelle » qui remplace avantageusement les fonctions de copie ou de concaténation.

Exemple 72. Fabrication d’une chaîne quelconque : voir sprintf dans l’Exemple 71.

L’utilisation de sprintf est souvent préalable à un affichage, en particulier dans le mode graphique pour lequel printf n’existe pas (fenêtre « Windows »), ou encore dans un fichier texte. Par exemple, la fonction

MessagePopup de CVI affiche n’importe quoi dans une fenêtre popup, pourvu qu’on le lui donne sous

forme de chaîne de caractères (avec un titre en option). Voir Exemple 71. L’affichage de la chaîne de l’exemple ci-dessus peut ainsi s’écrire :

MessagePopup ("Combien gagnent-ils ?", phrase); /* la chaîne constante est le titre */

Une autre application possible de sprintf est la conversion de valeurs numériques (entières ou réelles) en

chaînes de caractères.

Exemple 73. Conversion d’une valeur numérique en chaîne avec sprintf

12.4.2 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

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 » */

Pour convertir l’entier 9876543 en la chaîne "9876543", il suffit d’écrire :

sprintf( chaine, "%ld ", entier_long_a_convertir ) ;

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) :

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èse) doit figurer tel qu’il est écrit dans la chaîne à lire.

12.4.3 Longueur d'une chaîne avec strlen (utilité : **)

La fonction strlen fournit la longueur utile d'une chaîne de caractères (c’est-à-dire le nombre de caractères réellement mémorisés ; le caractère nul de fin de chaîne n'est pas compté). Son prototype est :

int strlen( const char *chaine) ; /* pour l'utilisation, voir Exemple 70. */

12.4.4 Copie d'une chaîne (peut être effectuée aussi par sprintf) (utilité : **)

La fonction strcpy permet de copier une chaîne source dans une chaîne destination (y compris le caractère nul de fin de chaîne). La fonction renvoie l'adresse de la chaîne destination. Son prototype est :

char *strncpy( char *destination, char *source ) ; /* voir Exemple 70. */

La variante strncpy permet un contrôle supplémentaire, car elle copie au plus maxlen caractères de la chaîne source dans la chaîne destination. Son prototype est :

char *strncpy( char *destination, char *source, int maxlen ) ;

12.4.5

Concaténation de deux chaînes

(peut être effectuée par sprintf)

(utilité : *)

sprintf permet de faire de l’assemblage de chaînes, mais il existe aussi une fonction spécifique : la fonction

strcat permet d’ajouter une chaîne source à la fin d'une chaîne destination (c’est la "concaténation"). La fonction renvoie l'adresse de la chaîne destination. Son prototype est :

char *strcat( char *destination, char *source) ; /* voir Exemple 70. */

La variante strncat permet un contrôle supplémentaire, car elle ajoute au plus maxlen caractères de la chaîne source à la fin de la chaîne destination :

char *strncat( char *destination, char *source, int maxlen ) ;

12.4.6 Comparaison de deux chaînes (utilité : **)

La fonction normalisée ISO strcmp permet de comparer une chaîne chaine1 à une chaîne chaine2. La comparaison s'arrête quand deux caractères sont différents ou quand une chaîne est terminée. La fonction

strcmp renvoie l'entier 0 si les deux chaînes sont identiques. Son prototype est ;

int strcmp( char *chaine1, char *chaine2) ; /* voir Exemple 70. */

Il existe de multiples variantes, parmi lesquelles :

• strncmp : elle compare deux chaînes en se limitant aux maxlen premiers caractères

int strncmp( char *chaine1, char *chaine2, int maxlen );

• stricmp et strnicmp : variantes des deux précédentes, elles comparent deux chaînes sans faire de distinction entre majuscules et minuscules.

12.4.7 Recherches dans une chaîne (utilité : **)

Beaucoup de fonctions existent. En voici une liste non complète (voir aide en ligne de votre IDE) :

• La fonction strchr permet de rechercher la première apparition d'un caractère dans une chaîne. Voir Exemple 70.

• La fonction strtok divise une chaîne en sous-chaînes, en utilisant pour les séparer une liste de délimiteurs définis par l’utilisateur. D’utilisation un peu délicate (elle utilise un pointeur et son premier appel a un rôle particulier : voir Exemple 75. et l’aide en ligne du logiciel), elle est un outil efficace et puissant quand on sait l’utiliser.

L'aide en ligne est indispensable pour la manipulation des chaînes de caractères. Exemple 75. Découpage d’une chaîne en sous-chaînes par strtok

Voici le résultat obtenu :

Si on affiche les adresses successives des chaînes à l’aide d’une variante de ce programme, on obtient :

12.4.8 Conversions d'une chaîne en valeur numérique et réciproquement

On peut convertir une chaîne en un entier ou en un réel, et réciproquement :

• d'une chaîne vers une valeur numérique (entière, réelle) : atof, strtod (String TO Double), atoi,

strtol… On peut aussi utiliser sscanf (voir exemples sscanf), fonction « universelle » très utile

dans la manipulation de chaînes.

• d'une valeur numérique (entière, réelle) vers une chaîne : utilisez sprintf (voir exemples sprintf).

Vous consulterez l'aide en ligne de votre logiciel pour plus de détails.

static char texte[81] =

"salut: 1 2 3 partez! , 78.56 , comment allez-vous ? bien , -6541 , , fin"; char *ptr_chaine ; /* pointeur pour balayer les sous-chaînes obtenues */

printf("valeur initiale de la chaine : \n %s \n", texte );

ptr_chaine = strtok (texte, ","); /* appel d'initialisation de strtok. Séparateur = ',' */ while ( ptr_chaine != NULL )

{ /* on affiche la sous-chaîne courante avant de fabriquer la suivante : */

printf("\n Chaine lue a la position courante de ptr_chaine :%s", ptr_chaine);

ptr_chaine = strtok (NULL, ",?"); /* remplace le prochain séparateur trouvé par 0,

puis renvoie l'adresse de la chaîne ainsi obtenue. Séparateurs = ',' ou ' ?' */ }