Cours 2.4. Les caractères

Introduction

En pratique, dans la mémoire d'un ordinateur, il n'y a pas d'entiers ni de nombres réels. Tout est stocké en binaire et n'est qu'une question d'interprétation de ces mots binaires, d'où la nécessité de typer des variables. Le typage permet de savoir comment convertir le binaire en entier ou en nombre décimaux. La même donnée interprétée comme un entier ou comme un flottant donnera des valeurs différentes. Voici un exemple qui est d'ailleurs une erreur classique du développeur débutant :

float i=28;
printf ("%d", i);

Ce programme n'affiche pas 28. On déclare une variable de type float, mais au moment de l'affichage, on utilise le code de format %d qui va (au mieux) interpréter la variable comme un entier. Notons que certains compilateurs vont détecter le problème en affichant un avertissement.

Il en va de même pour la mémorisation des caractères. Dans la mémoire, il n'y a que des uns et des zéros. Il a donc fallu associer chaque valeur binaire à un caractère. C'est dans ce but qu'a été inventée la table ASCII.

La table ASCII

La table ASCII est une table qui associe un caractère à chaque valeur binaire. Initialement, la table ASCII contenait 128 caractères, principalement anglo-saxons. Elle a ensuite été étendue à 256 pour inclure des caractères étrangers, comme par exemple la cédille française ç. Des versions différentes co-existent pour chaque langue, mais normalement les 128 premiers caractères sont universels. L'image ci-dessous illustre cette table ASCII (source : Université de Lille 1)

Table ASCII

Le codage des caractères a continué d'évoluer avec notamment l'UTF-8 et l'Unicode. Unicode est conçu pour coder l’ensemble des caractères du répertoire universel de caractères, qui inclut les alphabets asiatiques, les émojis ... Ces codages modernes ne sont pas supportés nativement par le C, mais il est remarquable de noter que ces standards ont été conçus pour rester retro-compatible avec la table ASCII. Pour en savoir plus, je ne peux que vous inviter à découvrir cette merveilleuse vidéo de la chaine Computerphile (en anglais) :

Le type char

Le type char, comme son nom l'indique, est destiné à la mémorisation des caractères (en anglais, caractère se traduit par character). Un char occupe 1 octet en mémoire. Avec ces 8 bits, il est possible de coder 256 valeurs, ce qui permet d'y stocker un caractère de la table ASCII étendue.

Par exemple le code ci-dessous déclare une variable lettre et y affecte le caractère C :

char lettre = 'C';

Notez les guillemets simple qui stipulent qu'il s'agit d'un caractère.

Code de format

Le code de format permettant d'afficher un caractère est %c. Vous l'aurez normalement déjà compris, le type char est fréquemment utilisé pour mémoriser de petits entiers. Pour afficher un char sous forme décimale, il faudra utiliser le code de format %d. L'exemple suivant montre comment afficher le caractère C sous forme de caractère et sous forme d'entier :

char lettre = 'C';
printf ("Sous forme de caractère : %c\n", lettre);
printf ("Sous forme d'entier     : %d\n", lettre);

On constate que la lettre C s'affiche bien sous forme de caractère avec le code de format %c. De plus, lorsque l'on affiche la variable sous forme d'entier (%d), on constate que la lettre C majuscule a bien pour code ASCII 67 comme vous pourrez le vérifier dans la table ASCII ci-dessus.

Syntaxe des caractères

Supposons que l'on ait déclaré une variable i et que l'on souhaite affecter la lettre i dans une autre variable. Comment le compilateur va différencier la variable i du caractère i ?

Il existe une syntaxe en C qui permet de différencier les variables des caractères : un caractère est toujours écrit entre guillemets simples :

char a = i;   // Il s'agit de la variable i
char b = 'i'  // Il s'agit de la lettre i
char c = 8    // Il s'agit du chiffre 8
char c = '8'  // Il s'agit du caractère 8 pour code ASCII 56

Nous y reviendrons plus tard, mais notez que les chaînes de caractères (autrement dit du texte) sont encadrées par des guillemets doubles. Ne confondez pas

Caractères spéciaux

Comment feriez-vous pour affecter le caractère guillement simple à une variable ? Vous comprendrez aisément que la syntaxe ci-dessous est problématique :

char c = ''';

Pour résoudre ce problème, le C définit des caractères spéciaux, ceux-ci commencent par un anti-slash. La bonne solution pour assigner un guillemet simple est :

char c = '\'';

Voici quelque-uns des caractères spéciaux nous utiliserons dans la suite de ce cours :

Syntaxe Code ASCII Description
\t 9 tabulation
\n 10 retour à la ligne
\" 34 guillemet double
\' 39 guillemet simple
\\ 92 anti-slash
\% ou %% 37 pourcentage

Exercice 1

Écrire un programme qui déclare 3 variables de types char :

Pour chaque variable, affichez son contenu sous forme décimale.

Voici la sortie espérée :

Tabulation => 9
retour à la ligne => 10
Anti-slash => 92

Exercice 2

Écrire un programme qui affiche le caractère '9' sous forme de caractère et sous forme entier.

Voici l'affichage attendu :

Sous forme de caractère : 9
Sous forme d'entier     : 57

Vérifiez dans la table ASCII que le code du caractère '9' est bien 57.

Exercice 3

Écrire un programme qui affiche le caractère n°9 de la table ASCII sous forme de caractère et sous forme d'entier.

Voici l'affichage attendu :

Sous forme de caractère :   .
Sous forme d'entier     : 9.

Expliquez cet affichage.

Quiz

Comment sont stockées les variables dans la mémoire ?

Vérifier Bravo ! La mémoire est une immense succession de zéros et de uns. Essaie encore ...

Quelle place occupe un char en mémoire ?

Vérifier Bravo ! Un char occupe 1 octets (8 bits) en mémoire. Essaie encore ...

À quoi peut servir une variable de type char ?

Vérifier Bravo ! Le type char initialement dédié aux caractères est parfois utilisé pour de petite entiers. Essaie encore ...

Qu'est-ce que la table ASCII ?

Vérifier Bravo ! La table ASCII permet de coder des caractères en binaire, décimal ou hexadécimal. Essaie encore ...

Que veut dire ASCII ?

Vérifier Bravo ! J'espère que vous avez trouvé du premier coup ! Essaie encore ...

Qu'affiche le programme suivant ?

char c = 'P';
printf ("%c", c);
Vérifier Bravo ! Ça affiche la variable sous forme de caractère. Essaie encore ...

Qu'affiche le programme suivant ?

char c = 'P';
printf ("%d", c);
Vérifier Bravo ! Le code ASCII du caractère 'P' est 80. Essaie encore ...

Qu'affiche le programme suivant ?

char c = 80;
printf ("%c", c);
Vérifier Bravo ! Le caractère associé au code ASCII 80 est le caractère 'P'. Essaie encore ...

Qu'affiche le programme suivant ?

char c = 80;
printf ("%d", c);
Vérifier Bravo ! 80 affiché sous forme d'entier => tout simplement 80. Essaie encore ...

Qu'affiche le programme suivant ?

char c = 'w';
printf ("%c ", c);
printf ("%d ", c);
Vérifier Bravo ! Le premier affichage sous forme de caractère, le second sous forme d'entier. Essaie encore ...

Qu'affiche le programme suivant ?

char c = 128;
printf ("%d ", c);
Vérifier Bravo ! Ne perdez pas de vue qu'un char est compris entre -128 et 127. Essaie encore ...

Voir aussi


Dernière mise à jour : 15/09/2023