Está en la página 1de 8

Cours 3

Chaînes de caractères

Le type string n’existe pas en C, c’est une facilité offerte par le C++ pour le traitement des
chaînes de caractères. Ces dernières sont codées en C à l’aide de tableaux de caractères.

3.1 Déclaration et initialisation d’une chaîne de caractères


En C, une chaîne de caractères est codée à l’aide d’un tableau de caractères, en utilisant le
caractère spécial ’\0’ (dont le code ASCII est 0) pour indiquer la fin de la chaîne. Il faut donc

� �
compter un caractère de plus que le nombre de caractères "visibles". Ainsi,

� �
1 char ch[6] = {’h’,’e’,’l’,’l’,’o’,’\0’};

déclare une chaîne (tableau) de caractères pouvant stocker au maximum 5 caractères en plus du
caractère ’\0’.
Pour un confort d’utilisation, il est possible d’initialiser une variable de type chaîne de carac-

� �
tères avec une chaîne littérale. L’instruction

� �
1 char ch[6] = "hello";

est alors équivalente à l’instruction précédente. ch est un tableau de caractères de taille 6 contenant
les caractères de hello suivi du caractère ’\0’.
Il faut bien distinguer la capacité et la taille d’une chaîne de caractères. La capacité corres-
pond au nombre de lettres qu’elle peut contenir, alors que la taille est le nombre de caractères

� �
utilisés. Ainsi,

� �
1 char ch[10] = "hello";

déclare une chaîne ch de capacité 9 (plus le caractère ’\0’) dont la taille est 5 (plus ’\0’).
Remarque : Les cases non utilisées de la chaîne ch contiennent toutes le caractère ’\0’ puisque
lors de l’initialisation d’un tableau, les cases dont la valeur n’est pas donnée prennent la valeur 0
(qui est le code ASCII de ’\0’).
Attention : Comme pour les autres types de tableaux, l’initialisation n’est possible que lors de la
déclaration de la variable de type chaîne de caractères. Le reste du temps, une chaîne de caractères
ne peut se trouver à gauche d’une affectation sans être indicée.
Comme pour les autres types de tableaux, si un tableau est intialisé lors de sa déclaration, il

� �
n’est pas nécessaire de mettre la taille entre crochets.

� �
1 char ch[] = "hello";

25
IUT de Villetaneuse

déclarera un tableau de caractères de 6 cases, les 5 premières contenant les lettres du mot hello et
la dernière contenant ’\0’. En effet, le programme compte le nombre de caractères pour déterminer
la taille du tableau. Il est cependant préférable d’indiquer la taille entre crochets pour ne pas se
tromper.
Remarque : La chaîne de caractères "" est donc une chaîne vide contenant uniquement le carac-
tère ’\0’.
� Sur ce thème : Exercice 1, question 1, TD3

3.2 Saisie et Affichage d’une chaîne de caractères


Pour afficher une chaîne de caractères ch, il suffit d’utiliser l’instruction cout « ch;. Le pro-
gramme lit alors tous les caractères de ch jusqu’à rencontrer le caractère ’\0’. Par exemple,

� �
l’exécution du code :

1 char chaine[64] = "hello";


2 cout << chaine << endl;
3 chaine[1] = ’\0’;

� �
4 cout << chaine << endl;

� �
affichera :

1 hello

� �
2 h

Il faut donc faire extrêmement attention à ce qu’il y ait toujours le caractère ’\0’ à la fin d’une
chaîne de caractères. Autrement, cela peut entraîner des erreurs d’affichage, voire des erreurs de

� �
mémoire (erreur de segmentation). Dans certains cas, l’exécution du code :

1 char faux[6] = "hello";


2 faux[5] = ’!’;

� �
3 cout << faux << endl;

peut afficher plus de caractères (par exemple hello!@/) ou produire une erreur de segmentation.
La saisie d’une chaîne de caractères ch au clavier se fait grâce à la commande cin » ch. Dans
ce cas, le caractère ’\0’ est automatiquement ajouté après le dernier caractère saisi. Il faut par
contre faire attention car aucune vérification sur la capacité de la chaîne n’est faite ! On peut
donc saisir plus de caractères qu’il n’y a de place dans la chaîne, ce qui peut générer une erreur
de segmentation.
� Sur ce thème : Exercice 1, questions 2 et 3, TD3

3.3 Parcours d’une chaîne de caractères


Il est possible de parcourir une chaîne de caractères, comme n’importe quel tableau. De plus,
comme la fin de la chaîne est délimitée par le caractère ’\0’, il n’est pas nécessaire de connaître
sa taille.

3.3.1 Parcours à l’aide d’un indice


Une chaîne de caractères peut être parcourue en utilisant un entier correspondant à l’indice
des éléments. Pour afficher par exemple les lettres les unes en dessous des autres, on peut alors
écrire :
� �
Langage C �26 � 1ère année (2012/2013)
Département informatique

� �
1 char ch[64] = "exemple";
2 int i = 0;
3 //Tant que l’on n’a pas atteint la fin de la chaîne de caractères
4 while (ch[i]!=’\0’)
5 {
6 cout << ch[i] << endl;
7 i ++;

� �
8 }

3.3.2 Parcours à l’aide d’un pointeur


Il est bien sûr possible de parcourir une chaîne de caractères à l’aide d’un pointeur. L’exemple

� �
ci-dessous est alors modifié de la manière suivante :

1 char ch[64] = "exemple";


2 char *p = ch;
3 //Tant que l’on n’a pas atteint la fin de la chaîne de caractères
4 while (*p != ’\0’)
5 {
6 cout << *p << endl; //On affiche la lettre pointée par p
7 p++; //On décale le pointeur d’une lettre

� �
8 }

� Sur ce thème : Exercice 1, question 4, TD3


� Sur ce thème : Exercice 2, TD3

3.4 Informations complémentaires


3.4.1 Rappel : codage des caractères
Le langage C utilise le code ASCII pour coder les caractères. Le code ASCII associe à tout
caractère non accentué un entier compris entre 0 et 127. Par exemple, la lettre ’A’ correspond à
l’entier 65, ’B’ à l’entier 66, etc. Parmi les valeurs intéressantes, on a :
– les lettres majuscules codées entre 65 et 90 (dans l’ordre alphabétique),
– les lettres minuscules codées entre 97 et 122 (dans l’ordre alphabétique),
– les chiffres codés entre 48 et 57 (dans l’ordre croissant),
– l’espace correspond à l’entier 32,
– le saut de ligne (noté ’\n’) correspond à l’entier 10,
– le caractère ’\0’ correspond à l’entier 0.

En C, un caractère est donc représenté en mémoire par son code ASCII. Le type char cor-
respond donc à un entier (permettant de stocker au plus 128 valeurs). L’affichage d’une valeur
de type char affiche alors le caractère correspondant au code ASCII donné par cette valeur. Ceci
implique que l’on peut très facilement transtyper une valeur de type char en int et inversement.

� �
Par exemple :

1 char lettre = ’A’;


2 cout << lettre << endl;
3 cout << (int) lettre << endl;
4 cout << lettre + 1 << endl;

� �
5 cout << (char) (lettre +1) << endl;

affichera :
� �
1ère année (2012/2013) �27 � Langage C
IUT de Villetaneuse

� �
1 A
2 65
3 66

� �
4 B

Explications :
– L’instruction ligne 2 affiche A puisque lettre est de type char de valeur ’A’.
– L’instruction ligne 3 affiche 65 puisque la valeur ’A’ est transtypée en int. Le programme
affiche alors la valeur ASCII de la lettre ’A’.
– L’instruction ligne 4 affiche 66 car pour l’addition, le type char est automatiquement trans-
typé en int.
– L’affichage produit par la ligne 5 est B puisque le résultat de (lettre + 1), valant 66, est
transtypé en char et que le caractère associé au code ASCII 66 est la lettre ’B’.
Grâce à cette conversion implicite, on peut très facilement tester si un caractère est une lettre
� �
ou un nombre :
1 char c;
2 cin >> c;
3 if ( c >= ’A’ && c <= ’Z’)
4 cout << "Le caractère saisi est une lettre majuscule" << endl;
5 else if (c >= ’a’ && c <= ’z’)
6 cout << "Le caractère saisi est une lettre minuscule" << endl;
7 else if (c >= ’0’ && c <= ’9’)

� �
8 cout << "Le caractère saisi est un nombre << endl;

Attention : Le code ASCII ne gère pas les lettres accentuées. Il n’est donc pas possible d’affecter à
une variable de type char une lettre accentuée. Les accents sont également à éviter dans les chaînes
de caractères sur lesquelles on travaille puisque le comportement est complètement modifié (stocker
un accent prend en réalité deux caractères, ce qui modifie le nombre de lettres dans une chaîne).

3.4.2 Fonctions de manipulation de chaînes de caractères


Il existe des fonctions déjà définies permettant de manipuler des chaînes de caractères. Elles
permettent de copier une chaîne dans une autre, de compter le nombre de caractères d’une chaîne,
etc. Ces fonctions sont définies dans le fichier string.h et certaines sont expliquées dans l’exercice
4 du TD.
� Sur ce thème : Exercices 3 - 6, TD3

� �
Langage C �28 � 1ère année (2012/2013)
Département informatique

TD3 : Chaînes de caractères

Exercice 1 : Questions de compréhension* 1

� �
Question 1.1 : Indiquer quelles sont les déclarations et initialisations incorrectes.

1 char message1[64];
2 char message2[];
3 char message3[10] = {’o’,’u’,’i’,’\0’};
4 char message4[10] = {’n’,’o’,’n’,’\0’,’o’,’u’,’i’};
5 char message5[10] = "non oui";
6 char message6[] = "non oui";

� �
7 char message7[10] = "je ne sais pas";

� �
Question 1.2 : Donner les affichages obtenus par l’exécution du programme suivant :

1 char message[64] = "Bonjour tout le monde !";


2 cout << message << endl;
3 cout << message[0] << endl;
4 cout << message + 1 << endl;
5 char * p = message;
6 cout << p << endl;
7 cout << *p << endl;
8 p = message +4 ;
9 cout << p << endl;
10 cout << *p << endl;
11 message[3] = ’\0’;
12 cout << message << endl;
13 cout << p << endl;
14 p = message + 1;

� �
15 cout << p + 1<< endl;

Question 1.3 : Qu’affiche le programme suivant lorsque l’utilisateur saisit le mot hello au

� �
clavier ?

1 int main()
2 {
3 char ch[8] = "bonjour";
4 cin >> ch;
5 cout << ch << endl;
6 cout << "septieme caractère : " << ch[6] << endl;
7 return 0;

� �
8 }

Question 1.4 : Écrire un programme principal permettant à l’utilisateur de saisir une chaîne de
caractères et affichant cette chaîne en séparant les lettres par des virgules (si l’utilisateur saisit
bonjour, l’affichage doit être b,o,n,j,o,u,r). Utiliser le parcours avec indices puis le parcours
avec pointeurs.

Exercice 2 : Nombre d’occurences d’une lettre dans une chaîne*


1. Les étoiles indiquent la difficulté de l’exercice

� �
1ère année (2012/2013) �29 � Langage C
IUT de Villetaneuse

Définir une fonction retournant le nombre d’occurences d’une lettre dans une chaîne de carac-
tères.

Exercice 3 : Majuscules**
Question 3.1 : Définir une fonction enMajuscules prenant en paramètre une chaîne de caractères
et remplaçant dans cette chaîne toutes les lettres minuscules par les majuscules associées. Cette
fonction ne retournera rien. Appeler cette fonction dans un programme pour afficher une chaîne
en majuscules.

� �
Question 3.2 : On souhaite pouvoir appeler la fonction enMajuscules de la manière suivante :
1 int main()
2 {
3 char cc[] = "hi! hi! HI!";
4 cout << enMajuscules(cc) << endl;
5 return 0;

� �
6 }

Modifier la fonction définie précédemment en conséquence.

Exercice 4 : Fonctions sur les chaînes de caractères**


Question 4.1 : Créer une fonction unsigned long int tailleChaine(char s[]) qui retourne
le nombre de caractères de la chaîne s, le caractère ’\0’ n’étant pas compté.
Question 4.2 : Créer une fonction char* copieChaine(char dest[], char src[]) qui copie
la chaîne de caractères src dans dest. Cette fonction devra retourner le pointeur sur la chaîne
dest. Voici un exemple d’utilisation de cette fonction. (On suppose que les chaînes sont bien
formées, c’est-à-dire que le dernier caractère de chaque chaîne est ’\0’, et que la chaîne dest a
� �
une taille suffisante pour que l’on copie src dedans).
1 int main()
2 {
3 char s[64] = "bonjour";
4 char ch[64] = "hello world";
5 cout << s << ", " << ch << endl;
6 cout << "voila ce qui est copié : #" << copieChaine(s,ch) << "#" << endl;
7 cout << s << ", " << ch << endl;
8 return 0;

� �
9 }

� �
L’exécution du programme précédent doit donner :
1 bonjour, hello world
2 voila ce qui est copié : #hello world#

� �
3 hello world, hello world

Question 4.3 : Que se passe-t-il si l’on déclare maintenant les chaînes de caractères s et ch selon
char s[] = "bonjour"; et ch[] = "hello world"; ?
Question 4.4 : Écrire une fonction int compareChaines(char s1[], char s2[]) qui prend en
paramètre deux chaînes de caractères s1 et s2 et retourne 0 si les deux chaînes sont équivalentes,
-1 si s1 est avant s2 dans l’ordre lexicographique, et 1 sinon.
Remarque : Les fonctions tailleChaine(), copieChaine() et compareChaines() sont déjà
définies en langage C dans la bibliothèque string. Elles se nomment respectivement strlen(),
strcpy() et strcmp(). Les arguments et valeurs de retours sont exactement les mêmes. Pour les
utiliser, il ne faut pas oublier d’inclure le fichier string.h en début de code.

Exercice 5 : A l’envers**
� �
Langage C �30 � 1ère année (2012/2013)
Département informatique

Définir une fonction envers prenant en paramètre une chaîne de caractères et affichant cette
chaîne à l’envers. (La fonction ne renvoie rien).

Exercice 6 : Transformation d’une chaîne en un entier***


Définir une fonction chaineEntier prenant en paramètre une chaîne de caractères et retour-
� �
nant l’entier associé. Par exemple :
1 char test1 [] = "123";

� �
2 cout << chaineEntier( test1 ) + 1 << endl;

doit afficher 124. Cette fonction doit s’arrêter à la première erreur et doit pouvoir prendre en
compte les nombres négatifs.

� �
1ère année (2012/2013) �31 � Langage C
IUT de Villetaneuse

TP3 : Chaînes de caractères

Exercice 7 : Remplacement d’un caractère*


Définir une fonction remplace prenant en paramètre une chaîne de caractères et deux caractères
c_old et c_new. Cette fonction remplacera dans la chaîne de caractères tous les caractères c_old
par c_new. Appeler cette fonction dans le programme principal pour remplacer dans une chaîne
tous les espaces par des sauts de ligne.

Exercice 8 : Nombre de minuscules*


Écrire une fonction qui retourne le nombre de lettres minuscules (non accentuées) dans une
chaîne de caractères.

Exercice 9 : Suppression du premier ou dernier caractère d’une chaîne**


Question 9.1 : Définir une fonction prenant en paramètre une chaîne de caractères et supprimant
le premier caractère de cette chaîne.
Question 9.2 : Définir une fonction prenant en paramètre une chaîne de caractères et supprimant
le dernier caractère de cette chaîne.

Exercice 10 : Doubler une chaîne**


Définir une fonction chaineDouble prenant en paramètre une chaîne source, une chaine dest
et un entier maxCar. La fonction recopiera dans dest deux fois de suite la chaîne source avec un
� �
maximum de maxCar caractères (sans compter le caractère ’\0’). Par exemple :
1 int main()
2 {
3 char test[] = "abcdef";
4 char res[10];
5 chaineDouble(test,res,9);
6 cout << res << endl;
7

8 char test2[] = "ABCD";


9 char res2[64];
10 chaineDouble(test2,res2,63);
11 cout << res2 << endl;
12 return 0;

� �
13 }

� �
devra afficher :
1 abcdefabc

� �
2 ABCDABCD

Exercice 11 : Transformation d’une chaîne en un flottant***


Définir une fonction chaineFlottant prenant en paramètre une chaîne de caractères et re-
� �
tournant le flottant associé. Par exemple :
1 char test1 [] = "123.43";

� �
2 cout << chaineEntier( test1 ) + 1 << endl;

doit afficher 124.43. Cette fonction doit s’arrêter à la première erreur et doit pouvoir prendre en
compte les nombres négatifs.

� �
Langage C �32 � 1ère année (2012/2013)

También podría gustarte