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 DecHexBinCaractèreDecHexBinCaractDecHexBinCaract
000[Null]432B101011+86561010110V
111[Start of Heading]442C101100,87571010111W
2210[Start of Text]452D101101-88581011000X
3311[End of Text]462E101110.89591011001Y
44100[End of Transmission]472F101111/905A1011010Z
55101[Enduiry]48301100000915B1011011[
66110[Acknowledge]49311100011925C1011100\
77111[Bell]50321100102935D1011101]
881000[Backspace]51331100113945E1011110^
991001[Horizontal Tab]52341101004955F1011111_
10A1010[Linefeed]5335110101596601100000`
11B1011[Vertical Tab]5436110110697611100001a
12C1100[Form Feed]5537110111798621100010b
13D1101[Carriage Return]5638111000899631100011c
14E1110[Shift Out]57391110019100641100100d
15F1111[Shift In]583A111010:101651100101e
161010000[Data Link Escape]593B111011;102661100110f
171110001[Device Control 1]603C111100103671100111g
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]65411000001A1086C1101100l
231710111[Eng of Trans. Block]66421000010B1096D1101101m
241811000[Cancel]67431000011C1106E1101110n
251911001[End of Medium]68441000100D1116F1101111o
261A11010[Substitute]69451000101E112701110000p
271B11011[Escape]70461000110F113711110001q
281C11100[File Separator]71471000111G114721110010r
291D11101[Group Separator]72481001000H115731110011s
301E11110[Record Separator]73491001001I116741110100t
311F11111[Unit Separator]744A1001010J117751110101u
3220100000754B1001011K118761110110v
3321100001!764C1001100L119771110111w
3422100010774D1001101M120781111000x
3523100011#784E1001110N121791111001y
3624100100$794F1001111O1227A1111010z
3725100101%80501010000P1237B1111011{
3826100110&81511010001Q1247C1111100
392710011182521010010R1257D1111101}
4028101000(83531010011S1267E1111110~
4129101001)84541010100T1277F1111111[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'}

  1. 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.

  1. 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;
}
  1. 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");
}
Retour