Vous êtes sur la page 1sur 8

Sofia Douda

Les chanes de caractres

En C, une chane de caractres est reprsente par une suite doctets correspondant chacun de ses caractres cods en ASCII, le tout tant termin par un octet supplmentaire de code nul. Cela signifie que, dune manire gnrale, une chane de n caractres occupe en mmoire un emplacement de n+1 octets. On peut par exemple reprsenter la chane "Bonjour" de la manire suivante: B o n j o u r \0 Exemple de lecture et dcriture dune chane de caractres #include <iostream> using namespace std; #include <conio.h> int main() { /* Trois variables dcrivant une chane de caractres */ char nom[20], prenom[20], ville[20] ; cout<<"Donnez votre nom et votre prenom : "; cin>>nom>>prenom; cout<<"Quelle est votre ville : "<<endl; cin>>ville; cout<<nom<<" "<<prenom<<" habite a la ville "<<ville; getch(); return(0); }

Les constantes chanes de caractres Examinons le programme suivant : #include <iostream> using namespace std; #include <conio.h> int main() { char *adr ; adr="bonjour"; do cout<<*adr; while(*adr++); getch(); return(0); }

Cours sur les chanes de caractres

Anne 2009/2010

Sofia Douda

La dclaration char *adr ; rserve simplement lemplacement pour un pointeur sur un caractre (ou une suite de caractres). En ce qui concerne la constante : bonjour Le compilateur a cr en mmoire la suite doctets correspondants mais, dans laffectation : adr= bonjour ; la notation bonjour a comme valeur, non pas la valeur de la chane elle-mme, mais son adresse. Le schma suivant illustre la situation aprs excution de cette affectation : b o n j o u r \0 adr

Initialisation de tableaux de caractres Supposons quon a la dclaration suivante : char ch[20] ; on ne peut pas crire : ch = bonjour ; En effet, ch est une constante pointeur et non une lvalue ; il nest donc pas question de lui attribuer une autre valeur (ici, il sagirait de ladresse attribue par le compilateur la constante chane bonjour). Par contre, on peut initialiser un tableau de caractres laide dune chane constante. Ainsi, vous pourrez crire : char ch[20] =bonjour ; Ceci sera parfaitement quivalent une initialisation de ch ralise par une numration de caractres (en nomettant pas le code zro not \0) : char ch[20] = {b, o, n, j, o, u, r, \0} ; Initialisation de tableaux de pointeurs sur des chanes Nous avons vu quune constante chane de caractres tait traduite par le compilateur en une adresse que lon pouvait, par exemple, affecter un pointeur sur une chane. Cela peut se gnraliser un tableau de pointeurs, comme dans : char * jour[7] = { lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche} ; Cette dclaration ralise donc, la fois : - la cration des 7 constantes chanes correspondants aux 7 jours de la semaine. - Linitialisation du tableau jour avec les 7 adresses de ces 7 chanes.

Cours sur les chanes de caractres

Anne 2009/2010

Sofia Douda

Exemple : #include <iostream> using namespace std; #include <conio.h> int main() { char *jour[7]={"lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"}; int i ; cout<<"Donnez un entier entre 1 et 7 : "; cin>>i; cout<<"Le jour numero "<<i<<" de la semaine est "<<jour[i-1]<<endl; getch(); return(0); }

Les fonctions de concatnation de chanes La fonction strcat (string.h) Exemple : #include <iostream> using namespace std; #include <conio.h> int main() { char ch1[50]="cours de "; char *ch2 ="programmation en C"; cout<<"Avant la concatenation, ch1= "<<ch1<<endl; strcat(ch1,ch2); cout<<"Apres la concatenation, ch1= "<<ch1<<endl; getch();return(0); }

A lexcution, vous aurez : Avant la concatenation, ch1= cours de Apres la concatenation, ch1= cours de programmation en C

Cours sur les chanes de caractres

Anne 2009/2010

Sofia Douda

Lappel de strcat se prsente ainsi : strcat(dest, source) Cette fonction recopie la seconde chane (source) la suite de la premire (dest), aprs avoir effac le caractre de fin. strcat fournie en rsultat : - Ladresse de la chane correspondant la concatnation des deux chanes fournies en argument, lorsque lopration sest bien droule. Ce nest rien dautre que ladresse de dest. - Le pointeur nul lorsque lopration sest mal droule. La fonction strncat (string.h) Cette fonction dont lappel se prsente ainsi : strncat(dest, source, nb_car) travaille de faon semblable strcat en offrant en outre un contrle sur le nombre de caractres qui seront concatns la chane darrive (dest). Exemple : #include <iostream> using namespace std; #include <conio.h> int main() { char ch1[50]="cours de "; char *ch2 = "structures de donnes"; cout<<"Avant la concatenation, ch1= "<<ch1<<endl; strncat(ch1,ch2,10) ; cout<<"Apres la concatenation, ch1= "<<ch1<<endl; getch();return(0); }

A lexcution, vous aurez : Avant la concatenation, ch1= cours de Apres la concatenation, ch1= cours de structures

Les fonctions de comparaison de chanes Il est possible de comparer deux chanes en utilisant lordre des caractres dfinis par le code ASCII. a- la fonction : strcmp(chaine1, chaine2) compare deux chanes dont on lui fournit ladresse et elle fournit une valeur entire dfinie comme tant : - positive si chaine1 > chaine2 (c'est--dire si chaine1 arrive aprs chaine2, au sens de lordre dfini par le code ASCII) - nulle si chaine1= chaine2 (c'est--dire si ces deux chanes contiennent exactement la mme suite de caractres)

Cours sur les chanes de caractres

Anne 2009/2010

Sofia Douda

ngative si chaine1<chaine2

Par exemple : strcmp(boucle, itration) est ngatif strcmp(bbb,aaa) est positif b- la fonction : strncmp(chaine1, chaine2, longmax) travaille comme strcmp mais elle limite la comparaison au nombre maximum de caractres indiqus par lentier longmax. Par exemple : strncmp(bonjour, bonsoir, 4) est ngatif tandis que : strncmp( (bonsoir, bonjour, 4) est positif. c- Enfin, deux fonctions : stricmp(chaine1, chaine2) strincmp(chaine1, chaine2) travaillent respectivement comme strcmp et strncmp, mais sans tenir compte de la diffrence entre majuscules et minuscules (pour les seuls caractres alphabtiques). Les fonctions de copie de chanes a- la fonction : strcpy(dest, source) recopie la chane situe ladresse source dans lemplacement dadresse dest. L encore, il est ncessaire que la taille du second emplacement soit suffisante pour accueillir la chane recopier, sous peine dcrasement intempestif. Cette fonction fournit comme rsultat ladresse de chane dest. b- la fonction : strncpy(dest, source, longmax) procde de manire analogue strcpy, en limitant la recopie au nombre de caractres prciss par lexpression entire longmax. Si la longueur de la chane source est infrieure cette longueur maximale, son caractre de fin (\0) sera effectivement recopi. Mais, dans le cas contraire, il ne le sera pas. Lexemple suivant illustre les deux situations : #include <iostream> using namespace std; #include <conio.h> int main() { char ch1[20]="xxxxxxxxxxxxxxxxx"; char ch2[20] ; cout<<"Donnez une chaine : "; cin>>ch2; strncpy(ch1,ch2,6) ; cout<<"ch1 = "<<ch1<<endl; getch();return(0); }

Cours sur les chanes de caractres

Anne 2009/2010

Sofia Douda

Dans une 1re excution : Donnez une chane : bon Bon Dans une 2me excution : Donnez une chane : bonjour Bonjouxxxxxxxxxxx

c- la fonction : strdup(chaine) effectue une recopie de la chane dont lui fournit ladresse en argument dans un emplacement quelle alloue dynamiquement et dont elle fournit ladresse en rsultat (elle fournit un pointeur nul si elle na pas pu disposer de suffisamment de place mmoire). #include <iostream> using namespace std; #include <conio.h> int main() { char ch1[40]="cours de programation"; char *ch2; ch2=strdup(ch1); cout<<"ch2 = "<<ch1<<endl; getch();return(0); }

Les fonctions de recherche dans une chane On trouve, en langage C, des fonctions classiques de recherche de loccurrence dans une chane dun caractre ou dune autre chane (nomme alors sous-chane). Ces fonctions fournissent comme rsultat ladresse de linformation cherche en cas de succs, et le pointeur nul dans le cas contraire. - strchr(chane, caractre) recherche, dans chane, la premire position o apparat le caractre mentionn. - strrchr(chane, caractre) ralise le mme traitement que strchr, mais en exploitant la chane concerne partir de la fin. Elle fournit donc la dernire occurrence du caractre mentionn. - strstr(chane, sous-chane) recherche, dans chane, la premire occurrence complte de la sous-chane mentionne. - strpbrk(chane1, chane2) recherche, dans chane1, la premire occurrence dun caractre quelconque de chane2.

Cours sur les chanes de caractres

Anne 2009/2010

Sofia Douda

Le programme suivant illustre le fonctionnement de ces quatre fonctions :


#include <iostream> using namespace std; #include <conio.h> const char c='e'; const char *sch="re"; const char *voy="aeiou"; int main() { char mot[40]; char *adr ; cout<<"Donnez un mot : "<<endl; cin>>mot; if (adr=strchr(mot, c)) cout<<"Premiere occurrence de "<<c<<" est :"<<adr<<endl; if (adr=strrchr(mot, c)) cout<<"Derniere occurrence de "<<c<<" est :"<<adr<<endl; if (adr=strstr(mot,sch)) cout<<"Premiere occurrence de "<<sch<<" est :"<<adr<<endl; if (adr=strpbrk(mot, voy)) cout<<"Premiere occurrence de l'une des lettres de "<<voy<<" dans "<<mot<<" est "<<adr<<endl; getch();return(0); }

Autres fonctions - strlen (chane) : retourne le nombre de caractres de chane sans tenir compte du caractre de fin de chane. - strset(chane, car) remplace tous les caractres de chane par le caractre car. - strnset(chane, car, n) remplace les n premiers caractres de chane par le caractre car. - strupr(chane) convertit la chane en majuscules. - strlwr(chane) convertit la chane en minuscules. Les fonctions de conversion Conversion dune chane en une valeur numrique Il existe des fonctions permettant de convertir une chane de caractres en une valeur numrique de type int, long ou double. Ces fonctions ignorent les ventuels espaces de dbut de chane et utilisent les caractres suivants pour fabriquer une valeur numrique. Le premier caractre invalide arrte lexploration. Par contre, si aucun caractre nest exploitable, ces fonctions fournissent un rsultat nul. Ces fonctions sont dfinies dans stdlib.h atoi(chane) : fournit un rsultat de type int atol(chane) : fournit un rsultat de type long atof(chane) : fournit un rsultat de type double Le programme suivant illustre les possibilits de atoi et atof

Cours sur les chanes de caractres

Anne 2009/2010

Sofia Douda

#include <iostream> using namespace std; #include <conio.h> int main() { char ch[40]; int n; double x; do {cout<<"Donner une chaine et 0 pour arreter :"<<endl; cin>>ch; cout<<"Conversion en int : "<<(n=atoi(ch))<<endl; cout<<"Conversion en double : "<<(x=atof(ch))<<endl; } while(n) ; getch();return(0); }

Conversion dune valeur numrique en une chane Il existe trois fonctions de conversion dun entier en une chane. Celles-ci permettent dexprimer un nombre, non seulement sous forme dune suite de chiffres en base 10, mais galement dans nimporte quelle base. Elles sont particulirement bien adaptes pour afficher par exemple un nombre en binaire. Ces trois fonctions fournissent en rsultat un pointeur sur la chane obtenue (qui concide donc avec ladresse en chane). itoa (entier, chane, base) : travaille avec un entier de type int. ltoa (entier, chane, base) : travaille avec un entier de type long. ultoa (entier, chane, base) : travaille avec un entier de type unsigned long. Le programme suivant illustre les possibilits de itoa (celles des autres fonctions tant comparables). #include <iostream> using namespace std; #include <conio.h> int main() { char ch[50]; int n,b; do {cout<<"Donner un nombre "; cin>>n; cout<<"Donner une base (2/8/10)"; cin>>b; }while ((b<=0)|| ((b!=2) && (b!=8) && (b!=10))); cout<<n<<" converti en chaine donne "<<itoa(n,ch,b); getch();return(0); }

Cours sur les chanes de caractres

Anne 2009/2010