2.4- Manipulation de chaînes de caractères

Documents pareils
1.6- Génération de nombres aléatoires

Les chaînes de caractères

Chap III : Les tableaux

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Recherche dans un tableau

I. Introduction aux fonctions : les fonctions standards

Utilisation d objets : String et ArrayList

Généralités sur le Langage Java et éléments syntaxiques.

Chapitre 1 : La gestion dynamique de la mémoire

TD3: tableaux avancées, première classe et chaînes

Plan du cours. Historique du langage Nouveautés de Java 7

Structurer ses données : les tableaux. Introduction à la programmation

Chapitre 10. Les interfaces Comparable et Comparator 1

Programmation C++ (débutant)/instructions for, while et do...while

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Cours d initiation à la programmation en C++ Johann Cuenin

Langage Java. Classe de première SI

Initiation à la programmation en Python

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Programmer en JAVA. par Tama

Les structures. Chapitre 3

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

ACTIVITÉ DE PROGRAMMATION

PROJET ALGORITHMIQUE ET PROGRAMMATION II

TP, première séquence d exercices.

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Chapitre 2. Classes et objets

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Cours 1: Java et les objets

Les débordements de tampons et les vulnérabilités de chaîne de format 1

Premiers Pas en Programmation Objet : les Classes et les Objets

Solutions du chapitre 4

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Programme awk------introduction rapide

La gestion des exceptions

Algorithmique et programmation : les bases (VBA) Corrigé

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Bases de programmation. Cours 5. Structurer les données

Représentation d un entier en base b

Cours Informatique Master STEP

Conventions d écriture et outils de mise au point

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

et Programmation Objet

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Programmation Objet - Cours II

Algorithmique et Programmation, IMA

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère


SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Programme Compte bancaire (code)

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

LES DECIMALES DE π BERNARD EGGER

Une introduction à Java

Définitions. Numéro à préciser. (Durée : )

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Exercices sur les interfaces

Cours d Algorithmique et de Langage C v 3.0

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

4. Groupement d objets

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Approche Contract First

TP3 : Manipulation et implantation de systèmes de fichiers 1

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Le prototype de la fonction main()

Programmation défensive

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

INITIATION A LA PROGRAMMATION

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Le langage C. Séance n 4

TP : Gestion d une image au format PGM

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

entourer les catégories E q u i p e m e n t c o n c e r n é Lieu d'implantation : Charge initiale : Kg

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

1. Langage de programmation Java

C f tracée ci- contre est la représentation graphique d une

Programmation Orientée Objets Le Langage JAVA

Compléments de documentation Scilab : affichage de texte et formatage de nombres

Package Java.util Classe générique

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Projet de programmation (IK3) : TP n 1 Correction

PRXSENTATION D UN GESTIONNAIRE DE DONNEES NUMERIQUES HIERARCHISEES DESTINE AU DE- -POUILLEMENT D ENQUETES

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Examen Médian - 1 heure 30

Mobyt Intégration par Webservice TABLE DES MATIERES

Claude Delannoy. 3 e édition C++

Introduction au pricing d option en finance

OPÉRATIONS SUR LES FRACTIONS

Le langage C++ (partie I)

Présentation du PL/SQL

Transcription:

2.4- Manipulation de chaînes de caractères 1- Les chaînes de caractères comme des tableaux de caractères 2- La classe string 1 Les chaînes de caractères comme des tableaux de caractères Format des chaines En C, il n'existe pas de type hors les types primitifs. A fortiori, il n'existe pas de classe string. La gestion des chaînes de caractères passe alors par la manipulation de tableaux de char. Généralement une chaîne sera manipulée dans un tableau de char surdimensionné par rapport à la talle de la chaîne qu'il contient. Le caractère '\0' indique la position de la fin de chaîne. Par exemple, pour stocker le mot "Paris" dans un tableau de taille 10 : char chaine[10]; chaine[0]='p';chaine[1]='a';chaine[2]='r';chaine[3]='i';chaine[4]='s';chaine[5]='\0'; char chaine2[]={'p','a','n','t','h','e','o','n','\0'; Le caractère '\0' permet de savoir où se termine la chaîne et de manipuler les chaînes. On parle de caractère nul. Récupération de chaînes par les entrées utilisateurs En récupérant des données par cin, on constate que le caractère '\0' est introduit directement à la fin du mot : std::cout << "Rentrer une chaine quelconque\n"; char chaineutilisateur[100]; cin >> chaineutilisateur; char ch; for(int i=0;i<100 && ch!='\0';i++) {

ch=chaineutilisateur[i]; std::cout << i << " " <<ch; En rentrant la chaîne suivante : Rentrer une chaine quelconque Pronunciamento en Venezuela 0 P 1 r 2 o 3 n 4 u 5 n 6 c 7 i 8 a 9 m 10 e 11 n 12 t 13 o 14 On constate qu'effectivement, la boucle ne se poursuit pas sur l'ensemble du tableau. La seule raison en est que le caractère \0 a été rencontré. On constate qu'il a été introduit au niveau du caractère de césure qu'est l'espace. On verra au chapitre sur les flux comment récupérer des chaînes incluant des espaces. Fonctions des librairies cstring et cstdlib Des fonctions de copie issues du C, mais qui restent valables en C++. La fonction strcpy permet de copie un tableau de char vers un tableau de char. Cette fonction est comprise dans la librairie cstring : char t[]="les sanglots longs des violons"; char t2[100]; strcpy(t2,t); Ici la chaîne du tableau t est copiée dans la seconde chaîne. Un problème se pose si le tableau source (t dans le code qui précède) est plus grand que le tableau dans lequel on copie (t2 dans le code qui précède) : la copie se fera au delà de la limite du tableau dans lequel on copie. La fonction strncpy est identique à strcpy, mais elle arrête la copie si le tableau source est plus grand que le tableau cible. La fonction de copie permet également d'initialiser des chaînes : char t[100]; strcpy(t,"universite Paris II"); Dans la librairie cstring, il existe également une méthode de concaténation pour les string : char t[200]; strcpy(t,"universite Paris II"); strcat(t," localisee place du Pantheon"); strcat(t," a Paris");

D'autres fonctionnalités sur les chaînes comme tableaux de char sont fournies par les librairies cstdlib et cstring : ce sont des fonctions de recherche au sein des chaînes, des fonctions d'extraction de caractères, des fonctions de conversion de chaînes vers des variables de type double ou de type int. Ces fonctions ne sont pas évoquées ici : les chaînes dans leur version C n'ont été évoquées qu'à titre d'information et parce que ce type de technique connaît une certaine survivance. Néanmoins, on préférera largement gérer les string en utilisant la classe string fournie en CPP. Vers la classe string La manipulation des tableaux de char, seule méthode possible pour la manipulation de chaine en C, s'avère conduire à des erreurs et s'avère consommer beaucoup de ressources machine. Par ailleurs, cette gestion des chaines n'est pas orientée objet. C++ implémente donc une solution orientée objet au travers de la classe string. La manipulation des char* ou char[] représentait une grosse perte de temps pour le programmeur en C. L'introduction de la classe string en C++ résout beaucoup de difficultés. 2 La classe string C++ introduit la classe string qui est déclarée dans la librairie <string>. La manière dont les string sont implémentées en mémoire n'est pas traitée par la norme C++. La manipulation des string s'avère assez souple. Création et initialisation de chaînes Pour créer une chaîne vide : string str; Pour créer une chaîne avec un contenu : string str2("langage C++"); Pour créer une chaîne avec l'opérateur = : string str3="langage C++"; Initialiser une chaîne à partir d'une chaîne :

string str3="langage C++"; string str4(str3); Pour créer une chaîne à partir des 12 premiers caractères d'une chaîne : int main(){ string str("les sanglots longs des violons"); string st(str,0,12); std::cout << "\"" << st << "\"\n"; Ce code affiche "Les sanglots" : soit les caractères indiciés de 0 à 11 (12 caractères). D'autres méthodes sont possibles pour initialiser : int main(){ string str("les sanglots longs des violons"); string st(str.substr(4,12)); std::cout << "\"" << st << "\"\n"; On initialise a partir d'une sous-chaîne. Pour récupérer une string extraite à partir d'une string, on utilise la méthode substr(int,int) associée au string. Elle prend en paramètre deux entiers. Le premier est le numéro du caractère de début d'extraction et le second est le nombre de caractères extraits. Opérateurs sur les string Plusieurs opérateurs existent dont tous ne sont pas évoqués ici. + est l'opérateur de concaténation. string str("les sanglots longs des violons "); string str2("de l'automne blessent mon coeur"); int i=5; string str3=str+str2;

std::cout << str3; Ici, la chaine suivante est affichée : Les sanglots longs des violons de l'automne blessent mon coeur Comparaison des string Les opérateurs ==,!=, >, <, >=, <= ont été surchagés pour comparer des string. La comparaison est alors lexicographique : str1<str2 est vrai si les n premiers caractères de str et str2 sont identiques, mais que le n+1 ème caractère de str précède le n+1 ème caractère de str2. Quelques méthodes de string On a déjà noté qu'il existe une fonction d'extraction de sous-chaînes : substring. Il existe également une fonction de remplacement de caractères au sein d'une chaîne : la fonction replace. Elle a plusieurs versions surchargées. La plus utilisée prend trois paramètres : un numéro de départ, le nombre de caractères à éliminer de la chaîne courante et la chaîne de remplacement. string str("les sanglots longs des violons "); string str2("de l'automne blessent mon coeur"); std::cout << str.replace(str.size()-1,0," "+str2) << "\n"; Ici, on remplace dans str, à partir du dernier caractère (str.size() est la taille de la chaîne str). Il est également possible de localiser des sous-chaînes au sein des string. Il existe une série de fonctions de recherche. On se contente ici de donner la fonction find() : elle cherche un caractère ou une série de caractères au sein d'une chaîne et renvoie la première occurrence trouvée dans la chaîne. On peut utiliser find() avec une chaîne : string str("les sanglots longs des violons de l'automne blessent mon coeur"); int n=str.find("sanglots"); std::cout << n << "\n"; Cette exécution affiche 4. On peut aussi utiliser la fonction avec deux paramètres : une chaîne à rechercher, un numéro de caractère de début de recherche. find() renverra alors le numéro de la première occurrence de la chaîne à partir du numéro de recherche. Il est

possible de concevoir une fonction renvoyant toutes les occurrences d'une sous-chaîne à partir de là : #include <string> int main(){ string str("les sanglots longs des violons de l'automne blessent mon coeur"); int indicefin=str.size(); int indicedebut=0; string achercher("es"); while(indicedebut<indicefin) { int indice=str.find(achercher,indicedebut); std::cout << indicedebut << " " << indice << " " << indicefin << "\n"; if(indicedebut<=indice && indice <=indicefin) { indicedebut=indice+1; std::cout << "Occurrence de \""+achercher+"\" au caractere numero "<< indice << "\n"; else indicedebut=indicefin+1; Manipulation de string comme d'un tableau La fonction size(); de la classe string permet de récupérer la taille d'une chaîne. Il est possible de manipuler les chaînes comme des tableaux en utilisant size() et l'opérateur [], ou l'opérateur at : #include <string>

int main(){ string str("les sanglots longs des violons de l'automne blessent mon coeur"); for(int i=0;i<str.size();i++) std::cout << str.at(i) << " " << str[i] << "\n"; Les chemins de fichier A noter la manière d'écrire les chemins de fichiers. De la même manière qu'il faut introduire les sauts de ligne en écrivant '\n' dans une chaîne, introduire des tabulations en introduisant '\t' dans une chaîne, on introduit le caractère \ en mettant '\\' dans une chaîne : string vers1("freres humains qui apres nous vivez\n"); string vers2("n'ayez les coeurs contre nous endurciz,\n"); string auteur("\t\tvillon\n"); string str("c:\\cpp\\ecoexp\\simulation.txt"); std::cout << vers1+vers2+auteur+str;