Logo de kxs.frCours d'informatique pour le lycée et la prépa

Chaînes de caractères

char

Nous avons déjà vu le type char comme un type numérique stocké sur 1 octet. Or char signifie « character » qui veut dire « caractère » car un char est généralement utilisé pour stocker un caractère :

char c = 'A';
printf("%c\n", c);

Un caractère s'écrit toujours entre guillemets simples. La correspondance entre les caractères et les nombres se fait avec la tablea ASCII dont nous avons déja parlé :

Table ASCII
Dec Hex Bin Caractère Dec Hex Bin Caract Dec Hex Bin Caract
000[Null] 432B101011+ 86561010110V
111[Start of Heading] 442C101100, 87571010111W
2210[Start of Text] 452D101101- 88581011000X
3311[End of Text] 462E101110. 89591011001Y
44100[Ene of Transmission] 472F101111/ 905A1011010Z
55101[Enduiry] 48301100000 915B1011011[
66110[Acknowledge] 49311100011 925C1011100\
77111[Bell] 50321100102 935D1011101]
881000[Backspace] 51331100113 945E1011110^
991001[Horizontal Tab] 52341101004 955F1011111_
10A1010[Linefeed] 53351101015 96601100000`
11B1011[Vertical Tab] 54361101106 97611100001a
12C1100[Form Feed] 55371101117 98621100010b
13D1101[Carriage Return] 56381110008 99631100011c
14E1110[Shift Out] 57391110019 100641100100d
15F1111[Shift In] 583A111010: 101651100101e
161010000[Data Link Escape] 593B111011; 102661100110f
171110001[Device Control 1] 603C111100< 103671100111g
181210010[Device Control 2] 613D111101= 104681101000h
191310011[Device Control 3] 623E111110> 105691101001i
201410100[Device Control 4] 633F111111? 1066A1101010j
211510101[Negative Acknowledge] 64401000000@ 1076B1101011k
221610110[Synchronous Idle] 65411000001A 1086C1101100l
231710111[Eng of Trans. Block] 66421000010B 1096D1101101m
241811000[Cancel] 67431000011C 1106E1101110n
251911001[End of Medium] 68441000100D 1116F1101111o
261A11010[Substitute] 69451000101E 112701110000p
271B11011[Escape] 70461000110F 113711110001q
281C11100[File Separator] 71471000111G 114721110010r
291D11101[Group Separator] 72481001000H 115731110011s
301E11110[Record Separator] 73491001001I 116741110100t
311F11111[Unit Separator] 744A1001010J 117751110101u
3220100000 754B1001011K 118761110110v
3321100001! 764C1001100L 119771110111w
3422100010" 774D1001101M 120781111000x
3523100011# 784E1001110N 121791111001y
3624100100$ 794F1001111O 1227A1111010z
3725100101% 80501010000P 1237B1111011{
3826100110& 81511010001Q 1247C1111100|
3927100111' 82521010010R 1257D1111101}
4028101000( 83531010011S 1267E1111110~
4129101001) 84541010100T 1277F1111111[DEL]
422A101010* 85551010101U

Seul les nombres de 0 à 127 correspondent à des caractères, les 128 autres nombres de 128 à 255 n'ont pas d'équivalence.

Il est possible d'initialiser un char avec un nombre ou un caractère. On peut également l'afficher comme un caractère avec le marqueur %c ou comme un nombre avec le marqueur %d :

char c1 = 64;
printf("%d\n", c1);
printf("%c\n", c1);
char c2 = '@';
printf("%d\n", c2);
printf("%c\n", c2);

1) Écrire un programme qui affiche la liste des codes ASCII et de leur caractère correspondant pour les valeurs allant de 32 à 126. La sortie du programme devra commencer par ces lignes :

32 :  
33 : !
34 : "
35 : #
…
for (char i = 32; i <= 126; i++) {
	printf("%d : %c\n", i, i);
}

Chaîne de caratères

Définition

En C, une chaîne de caractères est un tableau de caractères, donc un tableau de char. On peut définir une chaîne de caractères comme un tableau :

char chaine[] = {'H', 'e', 'l', 'l', 'o', '!'};

Il est néanmoins possible de définir une chaîne de caractère de manière plus conviviale en encadrant simplement la chaîne de guillemets doubles :

char chaine[] = "Hello!";

Propriétés

Une chaîne de caratères est un tableau particulier car le compilateur ajoute systématiquement le caractère '\0' (code ASCII 0) à la fin de la chaîne. Il n'est donc pas nécéssaire de conserver ailleurs la longueur de la chaîne, il est possible de la retrouver. Par exemple, la chaîne précédente est stockée sous la forme : {'H', 'e', 'l', 'l', 'o', '!', '\0'}

2) Pour vérifier cela, proposer un programme qui affiche tous les caractères de la chaîne Hello! mais qui affiche également le suivant. On affichera le code ASCII de chaque caractère. (On rappelle qu'on accède aux éléments d'un tableau avec la notation chaine[i]).

char chaine[] = "Hello!";
for (int i=0; i<=17; i++) {
	printf("%c : %d\n", chaine[i], chaine[i]);
}

Affichage

Il est possible d'afficher une chaîne de caractères dans un printf avec le marqueur %s :

char chaine[] = "Hello!";
printf("%s\n", chaine);

string.h

La bibliothèque string.h fournit un grand nombre de fonctions sur les chaînes de caractères. La plus utile étant la fonction strlen qui renvoie la taille d'une chaînes de caractères.

char chaine[] = "Hello!";
printf("%ld\n", strlen(chaine));

On pourra avoir besoin de la fonction strcpy qui permet de copier une chaîne dans une autre :

char chaine[10];
strcpy(chaine, "Hello!");
/* 	On ne peut plus faire chaine = "Hello!"
	car le compilateur ne le permet qu'a la déclaration */

La fonction strcmp permet de comparer deux chaînes de caractère car il n'est pas possible de les comparer avec ==. Elle renvoie 0 si les chaînes sont identiques et une valeur différente de 0 sinon.

3) Créer une fonction myStrlen qui prend en paramètre une chaîne de caractères et renvoie le nombre de caractères qu'elle contient. Il ne faut pas utiliser string.h !

int myStrlen(char chaine[]) {
	int i = 0;
	while (chaine[i] != 0) {
		i++;
	}
	return i;
}

4) Compléter le programme ci-dessous qui demande à l'utilisateur un mot de passe et vérifie s'il est juste :

const char password[] = "azerty";

…

if ( … ) {
	printf("Le mot de passe est bon\n");
} else {
	printf("Le mot de passe est faux\n");
}
const char password[] = "azerty";

char input[10];

printf("Saisissez le mot de passe\n");
scanf("%s", input);


if (strcmp(password, input) == 0) {
	printf("Le mot de passe est bon\n");
} else {
	printf("Le mot de passe est faux\n");
}