Chanes de caractres Dfinition Reprsentation des chanes de

  • Slides: 58
Download presentation
Chaînes de caractères Définition. Représentation des chaînes de caractères. Fonctions permettant de manipuler des

Chaînes de caractères Définition. Représentation des chaînes de caractères. Fonctions permettant de manipuler des chaînes de caractères. Comparaison de chaînes de caractères. Copie de chaînes. Recherche d’une sous-chaîne dans une chaîne. Conversion de chaînes.

 Introduction aux chaînes de caractères en C Il n’existe pas de type spécial

Introduction aux chaînes de caractères en C Il n’existe pas de type spécial chaîne ou string en C. Une chaîne de caractères en C est traitée comme un tableau unidimensionnel de caractères. Il existe toutefois plusieurs fonctions spéciales pour le traitement de tableaux de caractères. char identificateur de variable [dimension du tableau]; Exemples : char Nom[20], Prenom[20]; char Phrase[300]; // L’identificateur représente l’adresse // du premier caractère de la chaîne. L’espace mémoire nécessaire pour stocker n caractères est n+1 octets car la chaîne de caractères doit se terminer par le symbole . C’est au programmeur de prévoir cet octet supplémentaire. Le compilateur C n’intervient pas à ce niveau; les répercussions se feront sentir à l’exécution du programme. 2

 Les chaînes de caractères constantes en C Elles sont indiquées entre guillemets. "Ceci

Les chaînes de caractères constantes en C Elles sont indiquées entre guillemets. "Ceci est une chaine. " une chaîne vide "" "Affichage de "guillemets" n" " représente le symbole " {'a', 'e', 'i', ''', 'o', 'u', 'y', ''} ' représente le symbole ' printf("Voici le caractere de fin de chaine. "); Voici le caractere Plusieurs chaînes de caractères constantes séparées par des espaces, des tabulateurs ou des sauts de lignes dans le texte du programme seront réunies en une seule chaîne constante. printf("Ainsi, il est possible" "t" "de definir de longues " "chaines de caracteres constantes en utilisant" "n" "plusieurs lignes dans le texte du programme. " ); 3

 Initialisation de chaînes de caractères en C Les tableaux peuvent être initialisés par

Initialisation de chaînes de caractères en C Les tableaux peuvent être initialisés par l’indication de la liste des éléments du tableau entre accolades. Exemple : char Nom[] = {'L', 'u', 'c', ''}; // Le # d’octets nécessaires (i. e. 4) est réservé. Une approche plus simple consiste à utiliser une chaîne de caractères constante. Exemple : char Nom[] = "Luc" // Le # d’octets nécessaires (i. e. 4) est réservé. On peut indiquer explicitement le nombre d’octets à réserver, si celui-ci est supérieur ou égal à la longueur de la chaîne d’initialisation. Exemple : char Nom[3] = "Luc" // Erreur. char Nom[5] = "Luc" L u c 0 4

 Accès aux éléments d’une chaîne de caractères en C Idem à l’accès à

Accès aux éléments d’une chaîne de caractères en C Idem à l’accès à un élément d’un tableau. 5

 Précédence des caractères dans l’alphabet d’une machine Elle est dépendante du code de

Précédence des caractères dans l’alphabet d’une machine Elle est dépendante du code de caractères utilisé. Pour le code ASCII, nous avons l’ordre suivant : . . . , 0, 1, 2, . . . , 9, . . . , A, B, C, . . . , Z, . . . , a, b, c, . . . , z, . . . #include <stdio. h> void main() { int i; printf("L'ensemble des caracteres ASCIIn"); for (i = 0; i < 256; i++) { if ((i%32) == 0) printf("n"); printf("%c ", (char) i); } printf("n"); } Les symboles spéciaux et les lettres accentuées n’ont aucune règle d’ordre spécifique. Ex. : 'M' < 'm' 6

 Précédence lexicographique des chaînes de caractères Cette relation de précédence suit l’ordre du

Précédence lexicographique des chaînes de caractères Cette relation de précédence suit l’ordre du dictionnaire et est définie de façon récurrente comme suit : Exemple : 7

Exemples de chaînes de caractères Exemples : Plusieurs librairies de fonctions de C sont

Exemples de chaînes de caractères Exemples : Plusieurs librairies de fonctions de C sont disponibles pour le traitement de chaînes de caractères. 8

Concaténation de chaînes de caractères #include <stdio. h> void main() { char Partie. I[30]

Concaténation de chaînes de caractères #include <stdio. h> void main() { char Partie. I[30] = {"Rien ne sert de courir, "}; char Partie. II[40] = {"il faut partir a point. "}; char Proverbe[75] = {""}; int i = 0, j = 0; while (Partie. I[i] != '') { Proverbe[i] = Partie. I[i]; i = i + 1; } while (Partie. II[j] != '') { Proverbe[i] = Partie. II[j]; i = i + 1; j = j + 1; } Proverbe[i] = ''; printf("Partie I : %sn", Partie. I); printf("Partie II : %sn", Partie. II); printf("Proverbe : %sn", Proverbe); } 9

 Suppression de la 1 ière occurrence d’une sous-chaîne #include <stdio. h> On ne

Suppression de la 1 ière occurrence d’une sous-chaîne #include <stdio. h> On ne doit pas utiliser la librairie string. void main() { enum bool {false, true}; char chaine[50]; char sous_chaine[25]; int longueur_chaine = 0, longueur_sous_chaine = 0; int i, j; enum bool occurrence; // Détermine s’il existe une occurrence // de la sous-chaîne dans la chaîne. printf("Saisir la chaine au clavier : "); gets(chaine); printf("Saisir la sous-chaine : "); gets(sous_chaine); 10

 Suppression de la 1 ière occurrence d’une sous-chaîne if(chaine[0] != '�' && sous_chaine[0]

Suppression de la 1 ière occurrence d’une sous-chaîne if(chaine[0] != '' && sous_chaine[0] != '') { while (chaine[longueur_chaine] != '') longueur_chaine++; while (sous_chaine[longueur_sous_chaine] != '') longueur_sous_chaine++; if (longueur_chaine >= longueur_sous_chaine) { // Recherche d’une occurrence de la sous-chaîne. for (i = 0; i < longueur_chaine-longueur_sous_chaine + 1; i++) { occurrence = false; for (j = 0; j < longueur_sous_chaine; j++) { if (chaine[i + j] != sous_chaine[j]) { occurrence = true; break; } } 11

 Suppression de la 1 ière occurrence d’une sous-chaîne if (!occurrence) { // Il

Suppression de la 1 ière occurrence d’une sous-chaîne if (!occurrence) { // Il existe une occurrence de la sous-chaîne // à partir de la position i de la chaîne. // La sous-chaîne est supprimée. for (j = i+ longueur_sous_chaine; j <= longueur_chaine; j++) chaine[j - longueur_sous_chaine] = chaine[j]; break; } } printf("%s", chaine); } 12

Les fonctions de stdio. h Dans cette librairie, on retrouve non seulement les fonctions

Les fonctions de stdio. h Dans cette librairie, on retrouve non seulement les fonctions scanf et printf mais, aussi, les 2 fonctions puts et gets, spécialement conçues pour l’écriture et la lecture de chaînes de caractères. printf avec le spécificateur de format %-i. js -i. j i j optionnel (si absent, la chaîne au complet est affichée). justification à gauche, optionnel (si absent, la justification à droite prévaut) largeur minimale du champ d’affichage largeur maximale du champ d’affichage. 13

La fonction printf de stdio. h 14

La fonction printf de stdio. h 14

La fonction puts de stdio. h puts(chaîne constante ou le contenu d’une variable) Exemple

La fonction puts de stdio. h puts(chaîne constante ou le contenu d’une variable) Exemple : puts(Txt); est équivalent à printf("%sn", Txt); 15

La fonction scanf de stdio. h scanf avec le spécificateur de format %s Permet

La fonction scanf de stdio. h scanf avec le spécificateur de format %s Permet de lire un mot du fichier d’entrée standard et le mémorise à l’adresse qui est associée à %s. La fonction scanf a besoin des adresses de ses arguments. Ces adresses sont désignées par l’opérateur &. #include <stdio. h> void main() { char Lieu[25]; int jour, mois, annee; Lieu désigne une adresse. printf("Entrez lieu et date de naissance : n"); scanf("%s%d%d%d", Lieu, &jour, &mois, &annee); } Deux champs sont séparés par un espace. La chaîne ne doit pas contenir d’espace. 16

La fonction gets de stdio. h gets lit une chaîne de caractères incluant l’espace

La fonction gets de stdio. h gets lit une chaîne de caractères incluant l’espace et termine par un retour de fin de ligne. #include <stdio. h> void main() { char Lieu[25]; gets(Lieu); puts(Lieu); } Le retour de fin de ligne est remplacé par le symbole de fin de chaîne . 17

Ex. d’utilisation des fonctions de stdio. h Lire un texte de moins de 200

Ex. d’utilisation des fonctions de stdio. h Lire un texte de moins de 200 caractères et remplacer chaque série d’espaces par un seul espace. #include <stdio. h> void main() { char texte[200]; int i, j = 0; gets(texte); for (i = 0; i < 200; i++) { if(texte[i] == '') break; if( texte[i] != ' ' || (texte[i] == ' ' && texte[i+1] != ' ')) { texte[j] = texte[i]; j = j+1; } } texte[j] = ''; puts(texte); } 18

Les fonctions de string. h Cette librairie fournit une multitude de fonctions pratiques pour

Les fonctions de string. h Cette librairie fournit une multitude de fonctions pratiques pour le traitement de chaînes de caractères. Voici une brève description des fonctions les plus utilisées : strlen(s) strcpy(s, t) strcat(s, t) strcmp(s, t) strncpy(s, t, n) strncat(s, t, n) strchr(s, c) Légende : fournit la longueur de la chaîne sans compter . copie t vers s ( inclus); retourne s. ajoute t à la fin de s; retourne s. compare s et t lexicographiquement et fournit un résultat : négatif si s précède t, nul si s est égal à t, positif si s suit t. copie au plus n caractères de t vers s; retourne s. ajoute au plus n caractères de t à la fin de s et termine s par ; retourne s. retourne la sous-chaîne de s débutant par la première occurrence de c dans s. n désigne un nombre de type int, c un caractère. s et t désignent une chaîne de caractères constante, le nom d’une variable déclarée comme tableau de type char ou un pointeur vers un type char (chap. 9). 19

Remarques sur les fonctions de string. h Puisque le nom d’une chaîne de caractères

Remarques sur les fonctions de string. h Puisque le nom d’une chaîne de caractères représente une adresse fixe en mémoire, on ne peut pas affecter une autre chaîne au nom d’un tableau : A = "Hello"; Il faut copier la chaîne caractère par caractère ou bien utiliser la fonction strcpy ou strncpy. strcpy(A, "Hello"); En C, la concaténation de chaînes de caractères ne se fait pas par le symbole + mais avec strcat ou strncat. En C, la fonction strcmp est dépendante du code de caractères. #include <stdio. h> #include <string. h> void main() { char prenom 1[20] = "Luc"; char prenom 2[20] = "Marc"; if (strcmp(prenom 1, prenom 2) < 0) puts("Luc vient avant Marc. "); } 20

Exemple sur les fonctions de string. h #include <stdio. h> #include <string. h> void

Exemple sur les fonctions de string. h #include <stdio. h> #include <string. h> void main() { char Proverbe[75] = {"Rien ne sert de courir, il faut partir a point. "}; char c; printf("Extraire la sous-chaine debutant par le caractere "); scanf("%c", &c); printf("%sn", strchr(Proverbe, c)); } Extraire la sous-chaine debutant par le caractere s sert de courir, il faut partir a point. Note : strrchr est idem à strchr sauf que l’on considère la dernière occurrence de c au lieu de la première. 21

 fonctions de string. h Exemple d’utilisation des Calcul de la longueur moyenne d’un

fonctions de string. h Exemple d’utilisation des Calcul de la longueur moyenne d’un mot dans une phrase. #include <stdio. h> #include <string. h> void main() { char texte[200]; int i, L; gets(texte); L = strlen(texte); for (i = 0; i < 200; i++) { if(texte[i] == '') break; if(texte[i] == ' ') L = L - 1; } printf("Longueur moyenne d'un mot : %5. 2 f", L / (float)(strlen(texte) - L + 1)); } 22

 fonctions de string. h Exemple d’utilisation des Lire un verbe régulier en «

fonctions de string. h Exemple d’utilisation des Lire un verbe régulier en « er » au clavier et afficher la conjugaison au présent de l’indicatif de ce verbe. #include <stdio. h> #include <string. h> void main() { char verbe[20], conjugaison[20] = ""; gets(verbe); strncpy(conjugaison, verbe, strlen(verbe) - 2); if( verbe[0] =='a' || verbe[0] =='e' || verbe[0] =='i' || verbe[0] =='o' || verbe[0] =='u') printf("J'%sen", conjugaison); else printf("Je %sen", conjugaison); printf("Tu %sesn", conjugaison); printf("Il %sen", conjugaison); printf("Nous %sonsn", conjugaison); printf("Vous %sezn", conjugaison); printf("Ils %sentn", conjugaison); } 23

 de stdlib. h Les fonctions Ces fonctions permettent la conversion de nombres en

de stdlib. h Les fonctions Ces fonctions permettent la conversion de nombres en chaînes de caractères et vice versa. chaîne nombre atoi(s) retourne la valeur numérique de type int représentée par s. atol(s) retourne la valeur numérique de type long représentée par s. atof(s) retourne la valeur numérique de type double représentée par s. Légende : s désigne une chaîne de caractères constante, le nom d’une variable déclarée comme tableau de type char ou un pointeur vers un type char (chap. 9). Note : - Les espaces au début d’une chaîne sont ignorés. - Pour une chaîne impossible à convertir, zéro est retourné. - La conversion s’arrête au premier caractère impossible à convertir. 24

 Les fonctions de stdlib. h - exemple #include <stdio. h> #include <stdlib. h>

Les fonctions de stdlib. h - exemple #include <stdio. h> #include <stdlib. h> void main() { char str[200]; puts("Entrez un nombre : "); gets(str); printf("Entree = %s n", str); printf("int = %d n", atoi(str)); printf("long = %ld n", atol(str)); printf("double = %f n", atof(str)); } 25

 Les fonctions de stdlib. h - exemple Entrez un nombre : 123 Entrez

Les fonctions de stdlib. h - exemple Entrez un nombre : 123 Entrez = 123 int = 123 long = 123 double = 123. 000000 Entrez un nombre : -123 Entrez = -123 int = -123 long = -123 double = -123. 000000 Entrez un nombre : 123. 45 Entrez = 123. 45 int = 123 long = 123 double = 123. 450000 Entrez un nombre : 12 E 3 Entrez = 12 E 3 int = 12 long = 12 double = 12000. 000000 Entrez un nombre : -1234567 Entrez = -1234567 int = -1234567 long = -1234567 double = -1234567. 000000 Entrez un nombre : 123 e-02 Entrez = 123 e-02 int = 123 long = 123 double = 1. 230000 Entrez un nombre : - 123 Entrez = - 123 int = 0 long = 0 double = 0. 000000 Entrez un nombre : 1234 f 5 Entrez = 1234 f 5 int = 1234 long = 1234 double = 1234. 000000 Entrez un nombre : -0, 1234 Entrez = -0, 1234 int = 0 long = 0 double = 0. 000000 26

Les fonctions de stdlib. h nombre chaîne itoa(n_int, s, b) Convertit en base b

Les fonctions de stdlib. h nombre chaîne itoa(n_int, s, b) Convertit en base b le premier argument en une chaîne de caractères qui sera affectée à s. ltoa(n_long, s, b) ultoa(n_unsigned_long, s, b) Légende : s désigne une chaîne de caractères dont la longueur maximale est 17 respectivement 33. #include <stdio. h> b est la base de conversion #include <stdlib. h> (entre 2 et 36). void main() n_int est un nombre de type int. { n_long est un nombre de type long. char str[200]; int i; n_unsigned_long est un nombre puts("Entrez un nombre : "); de type unsigned long. Convertit un entier en base 16 dans str. scanf("%d", &i); itoa(i, str, 16); puts(str); } 27

Les fonctions de ctype. h Ces fonctions servent à classifier et à convertir des

Les fonctions de ctype. h Ces fonctions servent à classifier et à convertir des caractères. Les symboles (é, è, â, …) ne sont pas considérés. Légende : c représente une valeur de type int qui peut être représentée comme caractère. 28

Les fonctions de ctype. h Les fonctions de conversion suivantes fournissent une valeur de

Les fonctions de ctype. h Les fonctions de conversion suivantes fournissent une valeur de type int qui peut être représentée comme caractère. La valeur originale de c reste inchangée. Exemple : #include <stdio. h> #include <ctype. h> void main() { char str = 'a'; printf("%c", toupper(str)); } 29

 Les tableaux de chaînes de caractères Tableau à 2 dimensions de type char

Les tableaux de chaînes de caractères Tableau à 2 dimensions de type char où chaque ligne contient une chaîne de caractères. char jour[7][9]; // Réserve de l’espace mémoire pour 7 mots de 9 // caractères dont 8 significatifs. On peut aussi initialiser le tableau lors de la déclaration par des chaînes de caractères constantes. char jour[7][9] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"}; 30

 Accès aux chaînes de caractères d’un tableau 31

Accès aux chaînes de caractères d’un tableau 31

 de caractères Affectation d’une chaîne 32

de caractères Affectation d’une chaîne 32

 Accès aux caractères 33

Accès aux caractères 33

 Afficher la conjugaison Lire un verbe régulier en « er » au clavier

Afficher la conjugaison Lire un verbe régulier en « er » au clavier et afficher la conjugaison au présent de l’indicatif de ce verbe. #include <stdio. h> #include <string. h> void main() { char sujet[6][6] = {"Je ", "Tu ", "Il ", "Nous ", "Vous ", "Ils "}; char terminaison[6][4] = {"e", "es", "e", "ons", "ez", "ent"}; char verbe[20], conjugaison[20] = ""; int i; gets(verbe); strncpy(conjugaison, verbe, strlen(verbe) - 2); if( verbe[0] =='a' || verbe[0] =='e' || verbe[0] =='i' || verbe[0] =='o' || verbe[0] =='u') strcpy(sujet[0], "J'"); for (i = 0; i < 6; i++) printf("%s%s%sn", sujet[i], conjugaison, terminaison[i]); } 34

 tableau de mots Exercice – Tri d’un Lire 10 mots dans un tableau,

tableau de mots Exercice – Tri d’un Lire 10 mots dans un tableau, les trier sans modifier le tableau et les afficher en ordre croissant. #include <stdio. h> #include <string. h> void main() { enum bool {false = 0, true}; int i, j; enum bool trie = true; char Ensemble_de_mots[10][25]; int Tindex[10]; // Contiendra les indices des composantes // du tableau comme s’il était trié. for (i = 0; i < 10; i++) { puts("Entrez un mot"); gets(Ensemble_de_mots[i]); Tindex[i] = i; } puts(""); 35

Exercice - Tri d’un tableau de mots // Tri des composantes du tableau. while(trie)

Exercice - Tri d’un tableau de mots // Tri des composantes du tableau. while(trie) { trie = false; for (i = 0; i < 9; i++) if (strcmp(Ensemble_de_mots[Tindex[i]], Ensemble_de_mots[Tindex[i+1]]) > 0) { trie = true; j = Tindex[i]; Tindex[i] = Tindex[i+1]; Tindex[i+1] = j; } } // Affichage des mots en ordre croissant. for (i = 0; i < 10; i++) puts(Ensemble_de_mots[Tindex[i]]); } 36

Traitement des chaînes de caractères en C++ En C++, nous avons 2 modes de

Traitement des chaînes de caractères en C++ En C++, nous avons 2 modes de représentation des chaînes de caractères, le style C et la classe string. En général, il vaut mieux utiliser la classe string même si, dans certaines applications, il peut être intéressant d’opter pour le style plus ancien issu de C. Pour utiliser le type string, il faut inclure son fichier d’en-tête : #include <string> Les définitions des modèles et toutes les fonctionnalités sont définies dans l’espace de nom std. #include <iostream> #include <string> using namespace std; . . . 37

 Déclaration et initialisation de variables de type string c 1("Allo"); // Une variable

Déclaration et initialisation de variables de type string c 1("Allo"); // Une variable de type string renferme les caractères // de la chaîne "Allo". string c 2(8, 'x'); // Une variable de type string renferme les caractères // de la chaîne "xxxx". string c 3; // Une variable de type string renferme une chaîne vide. string c 4 = "Mai"; // Permet d’initialiser une variable de type string. Note : Par contre, la classe string n’offre aucune conversion de type int ou char en string erreur 1 = 'c'; string erreur 2 ('u' ); string erreur 3 = 22; string erreur 4(8); Erreur de syntaxe. 38

Parallèle avec les tableaux de caractères Une variable de type string ne représente pas

Parallèle avec les tableaux de caractères Une variable de type string ne représente pas l’adresse du premier caractère de la chaîne mais un objet. Le contenu d’une variable de type string ne se termine pas nécessairement par un caractère o. Nous n’avons pas à gérer cela. Une chaîne de longueur 0, ne contenant aucun caractère, porte le nom de chaîne vide. Elle est écrite "". Contrairement aux variables numériques, les variables de type string sont toujours initialisées par défaut avec une chaîne vide : Ex. : string chaine; L’opérateur d’indice [] peut être utilisé avec des variables de type string pour accéder à des caractères individuels. Ces variables possèdent un premier indice de 0 et un dernier égal à la longueur de l’objet – 1. Ex. : chaine[i] réfère au caractère en position i de la chaîne. 39

Utilisation des fonctions de la classe string La classe string renferme une multitude de

Utilisation des fonctions de la classe string La classe string renferme une multitude de fonctions pour traiter des chaînes de caractères. On fait appel à ces fonctions comme suit : Nom de la variable de type string. Nom de la fonction dans la classe string Soit une variable c de type string, c. size() la fonction size() retourne le # de caractères de c. Fonction capacity max_size ou length empty Fonctionnalité le nombre total de caractères pouvant être stockés sans devoir augmenter la capacité de mémoire de la chaîne. la longueur de la plus grande chaîne pouvant être stockée dans une variable de type string. le nombre de caractères stockés dans une chaîne. retourne true si la chaîne est vide, false autrement. 40

Exemple d’utilisation des fonctions #include <iostream> #include <string> using namespace std; void main() {

Exemple d’utilisation des fonctions #include <iostream> #include <string> using namespace std; void main() { string s("OUF"); cout << "capacite : " << "ntaille max. : " << "ntaille : " << "nlongueur : " << "nvide : " } SORTIE : capacite : 31 taille max. : 4294967293 taille : 3 longueur : 3 vide : false << s. capacity() << s. max_size() << s. length() << (s. empty() ? "true" : "false"); 41

Affectation de variables de type string L’opérateur = est bien défini. Ex. : string

Affectation de variables de type string L’opérateur = est bien défini. Ex. : string str 1 = "abc"; string str 2 = str 1; string str 3; str 3 = str 2; string str 4 = 'a'; string str 5; str 5 = 'b'; La fonction assign permet aussi d’affecter à une variable de type string une chaîne (ou un caractère) passée en paramètre. Ex. : string str 1 = "abcdefg"; string str 2; str 2. assign(str 1); string str 3; str 3. assign("abc"); string str 4; str 4. assign(4, 'b'); // Affecte 4 occurrences de 'b'. string str 5; // Affecte les 2 premiers caractères str 5. assign(str 1, 2); // de str 1. string str 6; // Affecte au plus 4 caractères de str 1 str 6. assign(str 1, 5, 4); // à partir de la position 5. 42

Échange de contenu et accès à un caractère La fonction swap permet d’échanger le

Échange de contenu et accès à un caractère La fonction swap permet d’échanger le contenu de 2 chaînes. Ex. : string str 1 = "abc"; string str 2 = "ghij"; string str 3 = "def"; str 1. swap(str 2); swap(str 1, str 3); s[i] donne accès en lecture ou en écriture au iième caractère de la chaîne s où 0 i < s. length(). Ex. : string str = "abg"; str[str. length() - 1] = 'c'; cout << str[0] << str[1]; s. at(i) donne accès en lecture ou en écriture au iième caractère de la chaîne s où 0 i < s. length(). Ex. : string str = "abg"; str. at(str. length() – 1) = 'c'; cout << str. at(0) << str. at(1); 43

Comparaison de chaînes de caractères Les opérateurs suivants peuvent être utilisés : (==, !=,

Comparaison de chaînes de caractères Les opérateurs suivants peuvent être utilisés : (==, !=, <, >, <=, >=). Ex. : char C[] = "abcdef"; string str 1 = "abcdef"; string str 2 = "ghi"; if(C == str 1) if (str 1 < str 2) cout << "OK"; La fonction compare retourne : 0 si les 2 chaînes sont identiques, une valeur négative si la 1 ière chaîne est plus petite que la 2 e. une valeur positive sinon. Ex. : char C[] = "abcdef"; string str 1 = "abcdef"; string str 2 = "ghi"; if(str 1. compare(str 2) < 0) if (str 2. compare(C) > 0) cout << "OK"; if(str 1. compare(2, 3, str 2) < 0) // Compare au plus 3 caractères de // str 1 à partir de la position 2 avec str 2. if (str 2. compare(1, 2, C) > 0) cout << "OK"; 44

Effacer des caractères Les fonctions clear() et erase() enlèvent tous les caractères de la

Effacer des caractères Les fonctions clear() et erase() enlèvent tous les caractères de la chaîne. Ex. : string str = "abcdef"; if(str. erase(). length() == 0) cout << "OK"; La fonction erase(i, n) enlève au plus n caractères à partir de la position i. Si n est absent, tous les caractères de la position i jusqu’à la fin sont enlevés. Ex. : string str = "abcdef"; if(str. erase(2, 3) == "abf") cout << "OK"; 45

Concaténation de caractères L’opérateur += ou la fonction append permet d’ajouter une chaîne passée

Concaténation de caractères L’opérateur += ou la fonction append permet d’ajouter une chaîne passée en paramètre à la fin de la chaîne. Ex. : string str 1 = "ab"; string str 2 = "cde"; str 1 += str 2; // idem : str 1 += "cde"; str 2. append(str 1); // idem : str 2. append("abcde"); cout << str 1 << " " << str 2; // Sortie : abcde cdeabcde La fonction append permet aussi d’ajouter n occurrences d’un caractère passé en paramètre à la fin de la chaîne. Ex. : string str = "abc"; string str 1 = "***"; str. append(3, '*'); cout << str 1. append(str); // Sortie : ***abc*** Ex. : string str = "abcdefgh"; string str 1; str 1. append(str, 2, 3); cout << str 1; // Ajoute au plus 3 caractères de str à // partir de la position 2 à la fin de str 1. // Sortie : cde 46

Concaténation de caractères L’opérateur + effectue la concaténation de 2 chaînes de caractères. string

Concaténation de caractères L’opérateur + effectue la concaténation de 2 chaînes de caractères. string s 1("Plusieurs "); string s 2(" sont possibles"); string s 3; s 3 = s 1 + "combinaisons" + s 2 + ". "; cout << s 3 << endl << s 1 + "combinaisons" + s 2 + ". " << endl << s 1 << "combinaisons" << s 2 << ". " << endl; 47

Extraction d’une sous-chaîne de caractères La fonction substr permet d’extraire une sous-chaîne de la

Extraction d’une sous-chaîne de caractères La fonction substr permet d’extraire une sous-chaîne de la chaîne s. string s("une grosse tartelette"); cout << "1. " << s. substr(11) << endl << "2. " << s. substr(4, 6) << endl; 1. tartelette 2. grosse 48

Insertion d’une sous-chaîne de caractères #include <iostream> #include <string> using namespace std; void main()

Insertion d’une sous-chaîne de caractères #include <iostream> #include <string> using namespace std; void main() { string s 1("une montagne"); string s 2("filtres a air"); // Insérer la chaîne dans s 1 à partir de la position 4. s 1. insert(4, "grosse "); // Insérer dans s 1 à partir de la position 4 une sous-chaîne // de s 2 débutant à la position 3 d'au plus 5 caractères. s 1. insert(4, s 2, 3, 5); // Insérer dans s 1 2 occurrences de * à partir de la position 9. s 1. insert(9, 2, '*'); // Insérer dans s 1 2 occurrences de * à partir de la fin. s 1. insert(s 1. length(), 2, '*'); cout << s 1 << endl; } // Sortie : une tres **grosse montagne** 49

Recherche d’une sous-chaîne de caractères #include <iostream> #include <string> using namespace std; void main()

Recherche d’une sous-chaîne de caractères #include <iostream> #include <string> using namespace std; void main() { string s 1("Il est difficile de deviner la fin du film. "); // Recherche d'un caractère. cout << "Position de la 1 e occurrence du caractere d" << endl << "en se deplacant de la gauche vers la droite : " << s 1. find('d') << endl; cout << "Position de la 1 e occurrence du caractere d " << endl << "en se deplacant de la position 8 vers la droite : " << s 1. find('d', 8) << endl; cout << "Position de la 1 e occurrence du caractere d" << endl << "en se deplacant vers la gauche a partir de la fin : " << s 1. rfind('d') << endl; cout << "Position de la 1 e occurrence du caractere d" << endl << "en se deplacant de la position 16 vers la gauche : " << s 1. rfind('d', 16) << endl; 50

Recherche d’une sous-chaîne de caractères // Recherche d'une sous-chaîne. cout << "Position de la

Recherche d’une sous-chaîne de caractères // Recherche d'une sous-chaîne. cout << "Position de la 1 e occurrence de la chaine fi" << endl << "en se deplacant de la gauche vers la droite : " << s 1. find("fi") << endl; cout << "Position de la 1 e occurrence de la chaine fi" << endl << "en se deplacant de la position 11 vers la droite : " << s 1. find("fi", 11) << endl; cout << "Position de la 1 e occurrence de la chaine fi" << endl << "en se deplacant vers la gauche a partir de la fin : " << s 1. rfind("fi") << endl; cout << "Position de la 1 e occurrence de la chaine fi" << endl << "en se deplacant de la position 37 vers la gauche : " << s 1. rfind("fi", 37) << endl; } 51

Recherche d’une sous-chaîne de caractères Il existe aussi d’autres fonctions de recherche : find_first_of

Recherche d’une sous-chaîne de caractères Il existe aussi d’autres fonctions de recherche : find_first_of : Retourne la position du premier caractère rencontré faisant partie d’une sous-chaîne passée en paramètre. find_first_not_of : Retourne la position du premier caractère rencontré ne faisant pas partie d’une sous-chaîne passée en paramètre. find_last_of : Retourne la position du dernier caractère rencontré faisant partie d’une sous-chaîne passée en paramètre. find_last_not_of : Retourne la position du dernier caractère rencontré ne faisant pas partie d’une sous-chaîne passée en paramètre. 52

Remplacement d’une sous-chaîne par une autre Exemple I : Remplacer tous les espaces par

Remplacement d’une sous-chaîne par une autre Exemple I : Remplacer tous les espaces par un "_" : string s("coude a coude"); int x = s. find(" "); while (x < string: : npos) { s. replace(x, 1, "_"); x = s. find(" ", x + 1) ; // longueur maximale de la chaîne // 3 paramètres : - indice de départ - le # de caractères à remplacer - la chaîne de remplacement // renvoie string: : npos lorsque la fin de s // est atteinte. } cout << s << endl ; SORTIE : coude_a_coude 53

Remplacement d’une sous-chaîne par une autre Exemple II : Remplacer dans la chaîne précédente

Remplacement d’une sous-chaîne par une autre Exemple II : Remplacer dans la chaîne précédente chaque "_" et le caractère suivant par ": " x = s. find("_"); while (x < string: : npos) // longueur maximale de la chaîne { s. replace(x, 2, "xxxxx. . yyy", 5, 2); // 5 paramètres : - indice de départ dans s - le # de caractères à remplacer dans s - la chaîne de remplacement - la sous-chaîne ". . " de longueur 2 à partir de la position 5 x = s. find("_", x + 1) ; // renvoie string: : npos lorsque la fin de s // est atteinte. } cout << s << endl ; SORTIE : coude…. oude 54

Afficher un texte selon un alignement justifié On suppose que tous les mots sont

Afficher un texte selon un alignement justifié On suppose que tous les mots sont séparés les uns des autres par un espace et que les symboles de ponctuation sont suivis d’un espace. Le texte est composé d’un seul paragraphe. #include <iostream> #include <string> using namespace std; void main() { string texte = "Et en effet, sur la planete du petit prince, il y avait " "comme sur toutes les planetes, de bonnes herbes et de mauvaises " "herbes. Par consequent, de bonnes graines de bonnes herbes et de " "mauvaises graines de mauvaises herbes. Mais les graines sont " "invisibles. Elles dorment dans le secret de la terre jusqu'a ce " "qu'il prenne fantaisie a l'une d'elles de se reveiller. "; // Le Petit Prince, // A. de Saint-Exupéry const short int Nombre_de_caracteres_par_ligne = 70; // traitement contiendra la portion de texte qui reste à afficher. string traitement = texte; 55

Afficher un texte selon un alignement justifié // Alignement justifié de chaque ligne à

Afficher un texte selon un alignement justifié // Alignement justifié de chaque ligne à l'exception de la dernière. while (traitement. length() > Nombre_de_caracteres_par_ligne) { // La variable une_ligne contiendra les caractères de la prochaine ligne. string une_ligne=traitement. substr(0, Nombre_de_caracteres_par_ligne); // On enlève de traitement tous les caractères de la première ligne en // excluant tous ceux qui suivent le dernier espace rencontré. traitement. erase(0, une_ligne. rfind(' ') + 1); // On enlève de la ligne à afficher tous les caractères qui suivent le // dernier espace rencontré. une_ligne. erase(une_ligne. rfind(' ') + 1); 56

Afficher un texte selon un alignement justifié // On ajoute à cette ligne le

Afficher un texte selon un alignement justifié // On ajoute à cette ligne le nombre de caractères "(char) 255" // nécessaires pour un alignement justifié. int x = une_ligne. find(' '); for (int i = une_ligne. length(); i < Nombre_de_caracteres_par_ligne; i++) { une_ligne. insert(x+1, 1, (char) 255); x = une_ligne. find(' ', x+1); if (x == string: : npos) x = une_ligne. find(' '); } // On remplace sur cette ligne chaque caractère "(char) 255" par un espace. x = une_ligne. find((char) 255); while (x != string: : npos) { une_ligne. replace(x, 1, " "); x = une_ligne. find((char) 255, x+1); } 57

Afficher un texte selon un alignement justifié // Affichage de cette ligne. cout <<

Afficher un texte selon un alignement justifié // Affichage de cette ligne. cout << une_ligne << endl; } // Affichage de la dernière ligne. cout << traitement << endl; } Note : Pour améliorer la performance de cet algorithme, soient n = le nombre d’espaces dans une ligne, m = le nombre d’espaces à ajouter pour un alignement justifié, Calculer R m / n S m % n Ajouter R+1 espaces aux S premiers espaces et R aux autres. Par ex. , on a : «Pierre et Luc ont raison. » n = 4, m = 6 R = 1, S = 2 58