Vous êtes sur la page 1sur 11

Traitement de chanes de caractres : <string.

h>
int strlen(const char *CH1) fournit la longueur de CH1 sans compter le '\0' final

char *strcpy(char *CH1, const char *CH2) copie CH2 vers CH1 ('\0' inclus); retourne CH1

char *strncpy(char *CH1, const char *CH1, int N) copie au plus N caractres de CH2 vers CH1; retourne CH1. Remplit la fin de CH1 par des '\0' si CH2 a moins que N caractres

char *strcat(char *CH1, const char *CH1) ajoute CH2 la fin de CH1; retourne CH1

char *strncat(char *CH1, const char *CH1, int N) ajoute au plus N caractres de CH2 la fin de CH1 et termine CH1 par '\0'; retourne CH1

int strcmp(const char *CH1, const char *CH1) compare CH1 et CH2 lexicographiquement et fournit un rsultat: ngatif si CH1 prcde CH2 zro si CH1 est gal CH2 positif si CH1 suit CH2

Application:voir le tp

L'en-tte <string.h>
Nous savons dclarer des chanes de caractres et les initialiser, mais pour l'instant, a s'arrte l. Dans cette partie, nous allons dcouvrir quelques fonctions de la bibliothque standard qui permettent d'effectuer des oprations diverses sur les chanes, comme calculer la taille ou bien copier une chane dans une autre. Tous les prototypes de ces fonctions sont dfinis dans le fichier d'en-tte <string.h>. Pour pouvoir les utiliser, vous allez devoir 'inclure comme ceci :
1 #include <string.h>

Chose tonnante, <string.h> ne contient pas que des fonctions qui manipulent des chanes de caractres : ce fichier d'en-tte fourni aussi des fonctions qui travaillent directement sur des blocs de mmoire. Nous allons dcouvrir tout cela au cours de ce chapitre.

Longueur Copie Comparaisons Recherche Autres Exercices

Longueur
La premire fonction que nous allons examiner est strlen, comme string lengh, soit longueur de chane. Cette fonction va nous permettre de rcuprer la taille de n'importe quelle chane de caractres sans compter le '\0' final.
Rsultat

La fonction retourne un size_t. Pour ceux qui ne se rappellent pas, size_t est un type qui sert stocker les tailles de donnes assez grosses, comme les tableaux ou les chanes de caractres. C'est donc normal que strlen donne un rsultat de type size_t. Il a t invent parce que sur certaines machines, il est possible de crer des donnes tellement grosses qu'on ne peut pas stocker leur taille dans un simple int ou un unsigned int.
Argument

Comme on le dduit de son utilit, cette fonction va prendre en argument une chaine de caractre dont il faut donner la taille. Ce paramtre est de type const char * : on a un pointeur sur char constant. Le lien entre pointeurs et tableaux se retrouve encore une fois. A notez la prsence de const, qui empchera toute modification, volontaire ou non, de la chane.
Prototype

De ce qu'on vient de dire prcdemment, on en dduit que son prototype est le suivant :
1 size_t strlen (const char * str);

Exemple

Illustrons ce code par un exemple. Je veux connaitre la taille de cette chane : "Bonjour les amis!". J'utilise donc strlen qui me renverra le nombre de caractres de cette chane.
1 char chaine[] = "Bonjour les amis!"; 2 3 printf("Taille de la chane = %u\n", (unsigned) strlen(chaine)); 1 Taille de la chaine = 17

Copie

strcpy - Copier une chane


Aprs strlen, qui permet de connaitre la longueur d'une chaine, voici le tour de strcpy. La fonction strcpy copie une chane dans une autre chane et renvoie un pointeur sur cette dernire. Elle copie tous les caractres, y compris le caractre nul '\0'. Pour vous souvenir de ce que cette fonction fait, vous devez savoir que strcpy est l'abrviation de strings copy soit copie de chanes.
Prototype

Son prototype est le suivant :


1 char * strcpy(char * dest, const char * src);

Ses deux arguments sont d'abord la chaine de destination, puis la chaine source.
Dbordements chaotiques

Cependant, strcpy a un lger problme. Elle ne fait aucune vrification sur les longueurs des chanes sources et de destination. Si la chane de destination est trop petite pour recevoir toute la chane d'origine, la fonction strcpy ne s'en aperoit pas. Consquence : elle crase les donnes situes aprs. Par exemple, voici un exemple de copie qui fonctionne, mais qui crase des donnes :
1 char bug[5]; 2 3 /* chane de destination trop petite donc problme */ 4 strcpy(bug, "bonjour");

Pour information, certains pirates utilisent ce comportement pour faire excuter des programmes malicieux. C'est ce qu'on appelle l'attaque par buffer overflow. Cela peut sembler ennuyeux, et dans les faits a l'est. Autre dtail : si jamais les deux chaines se recouvrent (c'est--dire si un morceau de la premire chaine est inclus dans la seconde ou rciproquement), le comportement de strcpy est indfini. En clair : les deux chanes doivent tre spares et bien distinctes et doivent occuper des zones de mmoire bien spares, sans recouvrements. Par exemple, si on souhaite copier une chaine dans elle-mme, le rsultat de strcpy est indtermin. Mme chose si on veut copier un morceau d'une chaine dans elle-mme.
3

Si les concepteurs du C ont dcids que strcpy aurait ce comportement, c'est encore une fois pour des raisons de performances. Effectuer des vrifications sur les longueurs des chanes sources et de destinations, a prend du temps. Et dans un langage conu pour la performance, c'est niet !

strncpy - Copie partielle d'une chane


Passons maintenant la fonction strncpy. Cette fonction est quasiment identique la prcdente, sauf que strncpy ne copie qu'un certain nombre de caractres. Au lieu de copier toute la chaine source dans la chaine de destination (comportement de strcpy), on peut demander strncpy de ne copier que n caractres.
Prototype

Voici le prototype de cette fonction :


1 char * strncpy(char * dest, const char * src, size_t n);

Comme on le voit, la valeur de retour est la mme que pour la fonction strcpy : il s'agit d'un pointeur qui pointe sur la chaine de destination.
Arguments

Passons maintenant aux arguments. Les deux premiers arguments sont, dans l'ordre, la chaine de destination, suivie de la chaine source. Le troisime argument est le nombre de caractres copier.
Consquences imprvues

Si cette fonction peut appraratre comme une bonne alternative la fonction strcpy de prime abord, sachez qu'il n'en est rien ! Tout d'abord, celle-ci souffre des mme problmes que strcpy : d'une part, elle ne fait aucune vrification sur la longueur respective des chaines et, d'autre part, si jamais les deux chaines se recouvrent, son comportement est indtermin. Ensuite, elle dispose de son propre lots de problmes : si la chane source est plus petite que la chane de destination, elle ajoute des caractres nuls en lieu et place des caractres manquants (ce qui nuit aux performances) ; l'inverse, si la chane de destination est plus petit que la chane source et que la taille maximale spcifie correspond celle de la chaine de destination, cette dernire ne sera pas termine par un caractre nul. Vous me demanderez sans doute pourquoi cette fonction existe si elle pose autant problme ? La rponse est simple : elle n'a en vrit pas t conue pour la manipulation de chane de caractres, mais pour la manipulation de champ de taille fixe (la notion de champ sera discute dans le chapitre consacr aux structures). En bref, oubliez cette fonction lorsque vous manipulez des chanes de caractres.

Comparaisons

strcmp - Comparer deux chanes

La fonction strcmp permet de comparer deux chanes de caractres, lettre par lettre. Pour s'en souvenir, il suffit de se dire que strcmp est l'abrviation de strings compare, qui veut dire comparaison de chanes en anglais.
Argument

Cette fonction strcmp prend deux arguments : ces deux arguments ne sont rien d'autre que les deux chanes comparer. Comme on ne modifie pas les chanes, ils sont tous les deux constants.
Valeur de retour

Petit dtail : cette fonction ne renvoie pas un boolen, comme on pourrait s'y attendre. Elle renvoie une valeur entire qui sera ngative, nulle ou positive si la premire chane est respectivement plus petite, de mme taille ou plus grande que la deuxime chane. Elle se base sur l'ordre alphabtique des lettres pour comparer les deux chaines de caractres.
Prototype

Voici donc son prototype :


1 int strcmp(const char * chaine1, const char * chaine2);

Exemple

Illustrons son utilisation par un exemple trs simple o je compare deux chanes :
1 2 3 4 5 6 7 8 9 10 11 12 char chaine1[] = "bonjour"; char chaine2[] = "bonsoir"; if (strcmp(chaine1, chaine2) == 0) { puts("Les chaines sont identiques."); } else { puts("Les chaines sont differentes."); }

Ce code affiche, sans surprise :


1 Les chaines sont diffrentes.

strncmp - Comparer deux chanes partiellement


Il existe une variante de la fonction strncmp qui permet de comparer des portions de chaines de caractres au lieu de chaines de caractres compltes. Plus prcisment, strncmp permet de ne comparer que les n premiers char de nos deux chanes. Cela permet de vrifier que les n premiers caractres sont identiques ou diffrents.

Valeur de retour

Son comportement est identique strcmp : elle renvoie une valeur entire qui sera ngative, nulle ou positive si la premire chane est respectivement plus petite, de mme taille ou plus grande que la deuxime chane.
Arguments

Cette fonction prend 3 paramtres. Elle prend notamment des pointeurs vers les deux chanes de caractres comparer. Le dernier paramtre est le nombre de char qu'il faut comparer, le fameux nombre n mentionn plus haut. Par exemple, si jamais je ne veux comparer que les 3 premires lettres, j'enverrais 3 comme paramtre. Si au contraire je veux en comparer 5, alors j'enverrais 5 la fonction.
Prototype

Voici son prototype :


1 int strncmp(const char * s1, const char * s2, size_t n);

Exemple
1 2 3 4 5 6 7 8 9 10 11 12 13 char chaine1[] = "bonjour"; char chaine2[] = "bonsoir"; const int n = 3; if (strncmp(chaine1, chaine2, n) == 0) { puts("Les deux chaines sont identiques."); } else { puts("Les deux chaines sont differentes."); }

1 Les deux chaines sont identiques.

On demande comparer les 3 premiers octets, et vu que les trois premiers caractres sont identiques, l'ordinateur affiche que les chanes sont identiques. Si on avait pris une valeur plus leve, il aurait affich Les deux chaines sont diffrentes .

Recherche

strchr - Rechercher un caractre


La fonction strchr permet de rechercher un caractre en particulier dans une chane. Pour vous en souvenir plus efficacement, il suffit de savoir que strchr est l'abrviation de string character.
Valeur de retour

Si notre fonction trouve le caractre chercher, elle renvoie un pointeur sur ce caractre, sinon elle renvoie NULL ; si le caractre est prsent plusieurs fois, elle renvoie un pointeur
6

sur la premire occurrence de ce caractre. Chose importante retenir : toujours bien vrifier que la fonction ne retourne pas NULL et agir en consquence si c'est le cas.
Paramtres

Le premier paramtre est la chane dans laquelle on doit effectuer la recherche, le deuxime paramtre tant le caractre rechercher. Il est de type int, ce qui ne change rien car au final les lettres sont des chiffres pour l'ordinateur.
Prototype

De ce qu'on vient de dire prcdemment, on en dduit que son prototype est le suivant :
1 char * strchr (const char * str, int c);

Exemple

Illustrons par un exemple : je veux chercher la premire occurrence de la lettre 'l' dans la phrase "Cours sur le langage C".
1 2 3 4 5 6 7 8 9 char chaine[] = "Cours sur le langage C"; char * str = strchr(chaine, 'l'); if (str != NULL) { /* notation quivalente str[0], revoyez le chapitre sur les tableaux si vous ne vous en rappelez plus */ printf("%c\n", *str); }

Comme strchr a trouv le caractre que je cherchais, elle a retourn un pointeur sur ce caractre.
Remarque

Au fait, petite astuce : rien nempche de considrer ce pointeur comme un pointeur sur une chaine. Dans ce cas, ce pointeur pointe sur le reste de la chaine de caractre, lettre 'l' inclue. Ainsi, le code suivant :
1 2 3 4 5 6 7 char chaine[] = "Cours sur le langage C"; char * str = strchr(chaine, 'l'); if (str != NULL) { puts(str); }

affiche ceci :
1 le langage C

strrchr - La cousine de strchr

Au fait, strchr possde une cousine. La fonction strrchr fait la mme chose mais elle retourne un pointeur sur le dernier caractre rencontr. C'est la seule diffrence ; tout ce qui a t dit prcdemment est valable aussi pour strrchr.

strpbrk - Rechercher une liste de caractres


Avec la fonction strchr vue prcdemment, on sait trouver la premire occurrence d'un caractre dans une chaine (ou la dernire, avec strrchr). C'est trs bien, mais on peut faire mieux. Imaginez que je veuille faire la mme chose, non pas avec une seule lettre, mais avec plusieurs. Par exemple, avec strchr, je peux savoir o se situe le premier 'l' dans une chaine. Mais pour trouver o se situe la premire lettre qui est soit un 'l', soit un 'a', je ne peux le faire avec strchr tout seul. On peut ruser, et utiliser un petit bout de code, mais le fait est que cette situation a dj t prvue par les concepteurs du C. Pour ce faire, on a invent la fonction strpbrk.
Valeur de retour

Cette fonction est diffrente de strchr et strrchr en un point : au lieu de ne rechercher qu'un seul caractre, elle recherche le premier caractre parmi une liste de caractres. Si elle trouve un des caractres chercher, elle renvoie un pointeur sur ce caractre. Sinon elle renvoie NULL.
Prototype

Son prototype est le suivant :


1 char * strpbrk(const char * str, const char * c);

Paramtres

Le premier paramtre est la chane dans laquelle on doit effectuer la recherche, le deuxime paramtre tant la liste de caractres rechercher.
Exemple

Prenons un exemple : je veux chercher les caractres 'u', 't' et 'l' dans la phrase "Salut aux lecteurs !".
1 char chaine[] = "Salut aux lecteurs !"; 2 char * str = strpbrk(chaine, "utl"); 3 4 if (str != NULL) 5 printf("Premiere occurrence de u, t ou l : %s\n", str);

Comme la fonction a trouv un des caractres que l'on voulait, elle s'arrte et renvoie un pointeur sur ce caractre :
1 Premire occurrence de u, t ou l : lut aux lecteurs !

L encore, la seule chose retenir est de vrifier le retour de la fonction.

strstr - Rechercher une chane dans une autre


Et enfin, nous terminons cet aperu des fonctions de recherche en parlant de strstr. La fonction strstr va rechercher si une chane de caractres est inclue dans une autre. Son rle est donc de rechercher des sous-chanes. Par exemple, si je prends la chaine "le langage C", je sais que la chane "langage" est inclue dedans. Pareil pour les chanes "lang", "gage C", etc.
Valeur de retour

Si elle trouve la chane chercher, elle renvoie un pointeur sur cette chane, sinon elle renvoie NULL.
Paramtres

Le premier paramtre est la chane dans laquelle il faut effectuer la recherche, et le deuxime est la chane rechercher.
Prototype

Son prototype est le suivant :


1 char * strstr(const char * str1, const char * str2);

Exemple

Supposons que je veuille chercher le mot "langage" dans la phrase "Cours sur le langage C".
1 char chaine[] = "Cours sur le langage C"; 2 char * str = strstr(chaine, "langage"); 3 4 if (str != NULL) 5 puts(str);

Comme la fonction a trouv la chane chercher, elle s'arrte et renvoie un pointeur sur cette chane :
1 langage C

Il n'y a pas beaucoup de diffrence avec la fonction prcdente, si ce n'est que strstr recherche toute la chane et pas seulement un ou plusieurs caractre(s).

Autres

strcat - Concatner deux chanes

La fonction strcat sert concatner deux chanes, c'est dire simplement coller deux chanes l'une la suite de l'autre. Par exemple, si je concatne les chanes "im" et "puissant", j'obtiendrais la chane "impuissant". Autre exemple : si je concatne la chane "abc" avec la chane "def", j'obtiendrai "abcdef". Pour vous souvenir de ce que fais cette fonction, sachez que srtcat est l'abrviation de strings concatenation, ce qui signifie concatnation de chanes en anglais.
Prototype

Le prototype de strcat est le suivant :


1 char * strcat(char * dest, const char * src);

Ce prototype est assez instructif. Il nous apprend que notre fonction strcat va concatner le contenu d'une chane source la suite d'une chane de destination. Elle renvoie un pointeur sur cette dernire. La chane source n'est pas modifie, mais la chane de destination l'est.
Exemple

Illustration avec un exemple dans lequel je veux concatner les phrases "bon" et "jour" :
1 2 3 4 5 6 char dest[50] = "bon"; const char * src = "jour"; printf("Avant : %s\n", dest); strcat(dest, src); /* on concatne */ printf("Apres : %s\n", dest);

Ce qui donne ceci l'cran :


1 Avant : bon 2 Aprs : bonjour

Attention !

Tout comme strcpy, la fonction strcat ne contrle pas la longueur des chanes passes en paramtre. Soyez donc prudent pour ne pas craser des donnes.

strncat - Concatner partiellement


Je ne sais pas si vous vous souvenez (mais vous devriez), mais strcpy avait une cousine du nom de strncpy, qui ne copiait qu'une partie de la chane copier. Et bien strcat possde aussi une cousine du mme genre. Il s'agit de la fonction strncat. Cette fonction fait la mme chose que la prcdente, sauf qu'elle ne concatne qu'une partie de la chane de destination. Au lieu de placer toute la chane source la suite de la chaine de destination (comportement de strcat), on peut demander strncat de ne copier que n caractres.

10

Prototype

Voici son prototype :


1 char * strncat(char * dest, const char * src, size_t n);

Comme on le voit, son prototype est identique celui de strcat, le seul nouvel argument tant le nombre de caractres concatner.
Exemple
1 2 3 4 5 6 7 8 char dest[50] = "bon"; const char * src = "jour"; int n = 2; printf("Avant : %s\n", dest); strncat(dest, src, n); printf("Resultat : %s", dest);

1 Avant : bon 2 Resultat : bonjo

Attention bis

Tout comme strcat, la fonction strncat ne vrifie pas la taille des chanes passes en paramtres. vitez donc de dborder.

Exercices

Palindromes
Un palindrome, vous savez ce que c'est ? Non. C'est simplement un texte qui se lit de la mme faon qu'on le lise de droite gauche. Par exemple, le mot RADAR est un palindrome. Mais cela fonctionne aussi pour les phrases. C'est le cas pour les phrases suivantes : "un art luxueux ultra nu", "Engage le jeu que je le gagne", etc.
nonc

Votre mission, si vous l'acceptez, sera de crer une fonction capable de vrifier si une chane de caractres est un palindrome. Celle-ci renverra 1 si la chane de caractre passe en entre est bien un palindrome ou zro si non.

11