Académique Documents
Professionnel Documents
Culture Documents
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
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
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 !
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
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
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."); }
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
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."); }
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
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
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.
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
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 !
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
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
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
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);
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.
10
Prototype
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);
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