Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
� �
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
� �
l’exécution du code :
� �
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 :
� �
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
� �
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 }
� �
ci-dessous est alors modifié de la manière suivante :
� �
8 }
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 :
� �
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).
� �
Langage C �28 � 1ère année (2012/2013)
Département informatique
� �
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 :
� �
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.
� �
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 }
� �
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).
� �
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
� �
13 }
� �
devra afficher :
1 abcdefabc
� �
2 ABCDABCD
� �
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)