3. Objectifs
ASD II
Savoir les chaines de caractères et leurs caractéristiques
Apprendre la manipulation des chaines de caractères en
algorithmique et en langage C
Définir les fonctions prédéfinies des chaines de caractères en
algorithmique et en langageC
3
4. Plan
ASD II
1) Introduction
2) Définition & Déclaration
3) Opérations sur les chaînes
4) Fonctions & Opérations prédéfinies
5) Tableaux de chaînes de caractères
6) Conclusion
4
5. Introduction
Le type de données chaine de caractères est manipulé comme un tableau
de caractères mais il diffère dans la déclaration.
Nous allons détailler dans cette partie:
La declaration
La manipulation
Quelques exemples d’utilisation
ASD II
5
6. Définition-Déclaration
ASD II
Une chaîne de caractère:
Est une structure de données homogène,
Permet le stockage, dans une même variable, un nombre fini d'éléments de types caractères.
C’est un tableau de caractères qui se termine par le caractère ‘0’ (En C, NULL).
Syntaxe:
6
En Algorithme En C
var : nom_chaine: chaine[taille]
char nom_chaine [taille]; // taille connue
Ou bien
char * nom_chaine ; // taille non connue
7. Définition-Déclaration (suite)
ASD II
7
‘b’ ‘o’ ‘n’ ‘j’ ‘o’ ‘u’ ‘r’ ‘0’
Exemple:
Pour représenter la chaîne de caractères " bonjour ", un tableau de huit caractères est
définit:
char ch[8] = {‘b’, ’o’, ’n’, ’j’, ’o’, ’u’, ’r’, '0'};
Ou
char ch[8] ="bonjour";
ch:
En Algorithme En C
var : ch : chaine[50]
//chaine de 49 caractères + caractère de fin de
chaine ‘0’
//déclaration d’une chaine sans
initialisation
char ch[50];
char * ch;
//déclaration d’une chaine avec
initialisation
char nom[20]= {‘a’, ‘l’, ‘i’, ‘0’};
8. ASD II
8
Opérations sur les chaines
Pour accéder à une case d'une chaine donnée, il faut utiliser:
le nom (identificateur) de la variable, et
le numéro de la case.
Exemples:
ch[3]; // ‘j’
ch[5]; // ‘u’
nomChaine [indice]
‘b’ ‘o’ ‘n’ ‘j’ ‘o’ ‘u’ ‘r’ ‘0’
ch:
indice: 0 1 2 3 4 5 6 7
9. Opérations sur les chaines (suite)
ASD II
9
Toutes les opérations élémentaires peuvent être appliquées sur une chaine de caractères.
Exemple : En Algorithmique En C
//lire en bloc la chaine "nom"
lire(nom) scanf ("%s", nom) ; ou gets (nom) ;
//afficher en bloc la chaine "nom"
écrire(nom) printf("%s", nom) ; ou puts (nom) ;
//affecter le caractère ‘A’ à la 2ème case de la chaine mot
mot[1]←’A’ mot[1]=‘A’;
//lecture du caractère d’indice 20 de la chaine nom
lire (nom[20]) scanf("%c ", &nom[20]);
//affecter la chaine "ABCD" à la chaine mot
mot ←"ABCD" mot = "ABCD" ;
10. Remarques en C
ASD II
10
L’affichage d’une chaine de caractères peut être fait en bloc ou bien caractère par
caractère.
Exemple1: Affichage d’une chaine caractère par caractère
void main()
{
char ch[20]="cours programmation"; /* déclaration d'une chaine initialisée*/
printf("la valeur de la chaine est:");
for(int i=0; ch[i] != '0’; i++) /* parcourir la chaine ch */
printf("%c", ch[i]); /* affichage caractère par caractère */
}
11. Remarques en C (suite)
ASD II
11
Exemple2: Affichage d’une chaine en bloc
Les chaines de caractères peuvent être comparées sur la base de l'ordre des codes ASCII de
chacun des caractères qui la constituent.
void main()
{
char ch1[20] ; //déclartion d'une chaine de taille max=20
printf("donner une chaine :") ;
scanf("%s", ch1) ; //ou gets(ch1) ; // Saisie d'une chaine
char ch2[14]= "Programmation" ; // déclaration d'une chaine initialisée
printf (" la chaine est : %s",ch2) ; //ou puts(ch2) ; //Affichage de la chaine
}
12. Fonctions et opérations prédéfinies
Les opérateurs en algorithmique
Les fonctions en algorithmique
Les fonctions en C
ASD II
12
13. Les opérateurs en Algorithme
ASD II
13
La concaténation (+) : permet de concaténer deux chaines (en C n’existe pas)
Exemple :
var : ch1, ch2 : chaine[20] // déclaration de deux chaines
ch1←"bonjour" // initialiser ch1 à la chaine "bonjour "
ch2←"à tous" // initialiser ch2 à la chaine "à tous "
ch1←ch1+ch2 // concaténer ch1 et ch2 dans la variable ch1
écrire (ch1) // afficher le contenu de ch1 "bonjour à tous"
14. Les opérateurs en Algorithme (suite)
ASD II
14
Ajout d'un caractère (°) : permet d'ajouter un caractère à droite ou à gauche d'une chaine
définie.
Exemple :
var : ch1 : chaine[20] // déclaration de ch1
ch1←"onjou" // initialiser ch1 à la chaine "onjou "
ch1←'B' ° ch1 // Ajouter le caractère ‘B’ à gauche de ch1
écrire (ch1) // afficher le contenu de ch1 "Bonjou"
ch1← ch1 ° ‘r’ // Ajouter le caractère ‘r’ à droite de ch1
écrire (ch1) // afficher le contenu de ch1 "Bonjour"
15. Les fonctions en Algorithme
ASD II
15
longueur (chaine) : renvoie le nombre de caractère d'une chaine sans le caractère de fin de la
chaine ’0’.
Exemple :
var : ch : chaine[10]
L : entier
……
ch←"bonjour"
L ← longueur(ch)
écrire("longueur de ch=", L) L=7
16. Les fonctions en Algorithme (suite)
ASD II
16
souschaine(chaine, position, n) : renvoie une sous-chaine (extrait de la chaine), de n
caractères, à partir d’une position donnée.
Exemple :
var : mot, ch : chaine[255]
……
mot ← "bonjour"
ch ← souschaine(mot, 1, 3) "onj"
17. Les fonctions en Algorithme (suite)
ASD II
17
gauche(chaine, n) : renvoie les n caractères les plus à gauche dans une chaine.
Exemple:
var : mot, ch : chaine[255]
…..
mot ← "bonjour"
ch ← gauche(mot, 3) "bon"
18. Les fonctions en Algorithme (suite)
ASD II
18
droit(chaine, n) : renvoie les n caractères les plus à droite dans une chaine.
Exemple :
var : mot, ch : chaine[255]
…….
mot ← "bonjour"
ch ← droit(mot, 4) "jour"
19. Les fonctions en Algorithme(suite)
ASD II
19
trouve(chaine1, chaine2):
renvoie la position de chaine2 dans chaine1.
renvoie 0 si chaine 2 n'existe pas dans chaine 1.
Exemple :
var : ch1, ch2 : chaine[255]
x : entier
…..
ch1 ← "bonjour"
ch2 ← "jour"
x ← trouve (ch1, ch2) // x = 3
20. Les fonctions en C
ASD II
20
Toutes les fonctions de manipulation des chaines de caractères en C nécessitent l’utilisation de
la bibliothèque « string.h »
strlen(ch) : renvoie le nombre de caractère de la chaine « ch » sans le caractère fin de la
chaine ’0’.
Exemple:
char ch[10] = "bonjour";
int L;
L= strlen(ch);
printf("longueur ch=%d", L); /* longueur ch= 7 */
21. Les fonctions en C (suite)
ASD II
21
strcpy (chaine2, chaine1) : permet de copier chaine1 vers chaine2
Exemple:
char ch1[20], * ch2;
ch1= "bonjour" ;
strcpy (ch2, ch1);
puts (ch2); // bonjour
strncpy (chaine2, chaine1,n) : permet de copier n caractères de chaine1 vers chaine2
Exemple:
char ch1[20], * ch2;
ch1= "bonjour" ;
strncpy (ch2, ch1, 3);
printf ("ch2=%s", ch2); // "bon"
22. Les fonctions en C(suite)
ASD II
22
strcat (chaine1, chaine2) : Ajoute chaine2 à la fin de chaine1
Exemple:
char ch1[20] = "bon";
char ch2[20] = "jour";
strcat(ch1, ch2);
puts(ch1); // “bonjour”
strncat (chaine1, chaine2, n) : copier n caractères de la chaîne chaine2 à la fin de la chaîne1
(même le caractère ‘0’)
Exemple:
char ch1[20] = "bonjour";
char ch2[20] = "monsieur";
strncat(ch1, ch2, 2);
printf(" ch1=%s", ch1); // ch1 = “bonjourmo”
23. Les fonctions en C(suite)
ASD II
23
strcmp(chaine1, chaine2): permet de comparer lexicographiquement deux chaines: chaine1 et
chaine2. La fonction retourne R:
R = 0 si chaine1 == chaine2
R < 0 si chaine1 précède chaine2
R > 0 si chaine1 suit chaine2
Exemple:
char ch1[20], ch2[20];
int res;
ch1= "bon"; ch2= "jour";
res=strcmp(ch1, ch2);
printf("%d", res); // res = -1
24. Activité1
Ecrire un algorithme (programme C) qui permet d’afficher les caractères
d’une chaine dans l’ordre inverse
Exemple: entrée: "bonjour" sortie: "ruojnob"
ASD II
24
25. Activité 2
Ecrire un programme qui lit deux chaine A et B et ajoute la chaine B à la fin de
la chaine A sans utilisé la fonction strcat() .
Utiliser deux pointeurs pA et pB pour effectuer l’opération.
ASD II
25
27. Pointeurs & chaine de caractères
27
L'utilisation des pointeurs vers les chaînes est aussi très courante (tout comme avec les tableaux)
pour des raisons de commodité de notation, efficacité et rapidité d'exécution.
Exemple : La fonction copiage permet de copier une chaîne source dans une chaine destination
Sans pointeur Avec pointeur
void copiage ( char dest[ ], char
source[ ])
{
int i ;
for (i = 0 ; source[i] ! =‘0' ; i++ )
dest[i] = source[i] ;
dest[i] =‘0';
}
void copiage ( char *dest, char
*source)
{
for (; *source != ‘0' ; source++, dest++)
*dest = *source ;
*dest =‘0' ;
}
28. Les tableaux de chaines de caractères
ASD II
28
Un tableau de chaines de caractères est un tableau dont chaque élément est une chaine. Chaque case
contient ainsi un tableau de caractères.
Tableau à deux dimensions de caractères.
Déclaration:
Exemples:
char JOUR [7] [9]= {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"};
7 chaines de longueur max 9 caractères
char * MOIS [12] = {"jan", "fev", "mars","avr", "may", "juin","juil","aout", "sep", "oct","nov", "dec"};
12 chaines de longueurs inconnues
char nomtableau [Nbr_chaine ][Nbr_caractères_par_chaine]
29. Les tableaux de chaines de caractères(suite)
ASD II
29
Exemple : char JOUR [7] [9]= {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"};
char * MOIS [12] = {"jan", "fev", "mars","avr", "may", "juin","juil","aout", "sep", "oct","nov", "dec"};
Afficher une chaine :
printf("%s", JOUR[2]) permet d’afficher "mercredi"
printf("%s", MOIS[0]) permet d’afficher "jan"
Afficher des caractères :
for (i=0 ;i<7 ;i++)
printf("%c", JOUR[i][0]) ; permet d’afficher le premier caractère de chaque chaine
Affectation : pas d’affectation directe
JOUR [4] = "vendredi" ; => Utiliser strcpy : strcpy(JOUR[4], "vendredi") ;
30. Conclusion
Dans ce chapitre nous avons :
Présenter la définition et la déclaration d’une chaine de caractères
Détailler les différentes fonctions prédéfinie en algorithme et en C pour
la manipulation des chaines de caractères
Montrer la relation entre pointeur et chaine de caractères
Manipuler les tableaux de chaines de caractères
ASD II
30