L1TI 2 AU 2020/2021 S1 Moncef BH 1 Les chaînes de caractères Une chaîne de cara

L1TI 2 AU 2020/2021 S1 Moncef BH 1 Les chaînes de caractères Une chaîne de caractères, c'est donc du texte que l'on peut retenir sous forme de variable en mémoire. On pourrait ainsi stocker le nom de l'utilisateur. Le type char Dans ce chapitre, nous allons porter une attention particulière au type char. Si vous vous souvenez bien, le type char permet de stocker des nombres compris entre -128 et 127. Si ce type char permet de stocker des nombres, il faut savoir qu'en C on l'utilise rarement pour ça. En général, même si le nombre est petit, on le stocke dans un int. Certes, ça prend un peu plus de place en mémoire, mais aujourd'hui, la mémoire, ce n'est vraiment pas ce qui manque sur un ordinateur. Le type char est en fait prévu pour stocker… une lettre ! Attention, j'ai bien dit : UNE lettre. Comme la mémoire ne peut stocker que des nombres, on a inventé une table qui fait la conversion entre les nombres et les lettres. Cette table indique ainsi par exemple que le nombre 65 équivaut à la lettre A. Le langage C permet de faire très facilement la traduction lettre <=> nombre correspondant. Pour obtenir le nombre associé à une lettre, il suffit d'écrire cette lettre entre apostrophes, comme ceci :'A'. À la compilation ,'A' sera remplacé par la valeur correspondante. Testons : int main(int argc, char *argv[]) { char lettre = 'A'; printf("%d\n", lettre); return 0; } 65 L1TI 2 AU 2020/2021 S1 Moncef BH 2 On sait donc que la lettre A majuscule est représentée par le nombre 65. B vaut 66, C vaut 67, etc. Testez avec des minuscules et vous verrez que les valeurs sont différentes. En effet, la lettre'a'n'est pas identique à la lettre'A', l'ordinateur faisant la différence entre les majuscules et les minuscules (on dit qu'il « respecte la casse »). La plupart des caractères « de base » sont codés entre les nombres 0 et 127. Une table fait la conversion entre les nombres et les lettres : la table ASCII (prononcez « Aski »). Afficher un caractère La fonctionprintf, qui n'a décidemment pas fini de nous étonner, peut aussi afficher un caractère. Pour cela, on doit utiliser le symbole%c(c comme caractère) : int main(int argc, char *argv[]) { char lettre = 'A'; printf("%c\n", lettre); return 0; } A Hourra ! Nous savons afficher une lettre. On peut aussi demander à l'utilisateur d'entrer une lettre en utilisant le%cdans un scanf : int main(int argc, char *argv[]) { char lettre = 0; scanf("%c", &lettre); printf("%c\n", lettre); return 0; } L1TI 2 AU 2020/2021 S1 Moncef BH 3 Si je tape la lettre B, je verrai : B B Le premier des deux B est celui que j'ai tapé au clavier, le second est celui affiché par leprintf. Voici à peu près tout ce qu'il faut savoir sur le typechar. Retenez bien :  le typecharpermet de stocker des nombres allant de -128 à 127,unsigned chardes nombres de 0 à 255 ;  il y a une table que votre ordinateur utilise pour convertir les lettres en nombres et inversement, la table ASCII ;  on peut donc utiliser le typecharpour stocker UNE lettre ;  'A'est remplacé à la compilation par la valeur correspondante (65 en l'occurrence). On utilise donc les apostrophes pour obtenir la valeur d'une lettre. Les chaînes sont des tableaux de char Comme on dit, tout est dans le titre. En effet : une chaîne de caractères n'est rien d'autre qu'un tableau de typechar. Un bête tableau de rien du tout. Si on crée un tableau : char chaine[5]; et qu'on met dans chaine[0]la lettre 'S', dans chaine[1]la lettre 'a'… on peut ainsi former une chaîne de caractères, c'est-à-dire du texte. La fig. suivante vous donne une idée de la façon dont la chaîne est stockée en mémoire (attention : je vous préviens de suite, c'est un peu plus compliqué que ça en réalité, je vous explique après pourquoi). L1TI 2 AU 2020/2021 S1 Moncef BH 4 Comme on peut le voir, c'est un tableau qui prend 5 cases en mémoire pour représenter le mot « Salut ». Pour la valeur, j'ai volontairement écrit sur le schéma les lettres entre apostrophes pour indiquer que c'est un nombre qui est stocké, et non une lettre. En réalité, dans la mémoire, ce sont bel et bien les nombres correspondant à ces lettres qui sont stockés. Toutefois, une chaîne de caractères ne contient pas que des lettres ! Le schéma de la fig. suivante est en fait incomplet. Une chaîne de caractère doit impérativement contenir un caractère spécial à la fin de la chaîne, appelé « caractère de fin de chaîne ». Ce caractère s'écrit'\0'. Pourquoi faut-il que la chaîne de caractères se termine par un\0? Tout simplement pour que votre ordinateur sache quand s'arrête la chaîne ! Le caractère\0permet de dire : « Stop, c'est fini, y'a plus rien à lire après, circulez ! » Par conséquent, pour stocker le mot « Salut » (qui comprend 5 lettres) en mémoire, il ne faut pas un tableau de 5char, mais de 6 ! Chaque fois que vous créez une chaîne de caractères, vous allez donc devoir penser à prévoir de la place pour le caractère de fin de chaîne. Il faut toujours toujours toujours ajouter un bloc de plus dans le tableau pour stocker ce caractère\0, c'est impératif ! Oublier le caractère de fin\0est une source d'erreurs impitoyable du langage C. Je le sais pour en avoir fait les frais plus d'une fois. L1TI 2 AU 2020/2021 S1 Moncef BH 5 La fig. suivante est le schéma correct de la représentation de la chaîne de caractères « Salut » en mémoire. Comme vous le voyez, la chaîne prend 6 caractères et non pas 5, il va falloir s'y faire. La chaîne se termine par'\0', le caractère de fin de chaîne qui permet d'indiquer à l'ordinateur que la chaîne se termine là. Voyez le caractère\0comme un avantage. Grâce à lui, vous n'aurez pas à retenir la taille de votre tableau car il indique que le tableau s'arrête à cet endroit. Vous pourrez passer votre tableau de char à une fonction sans avoir à ajouter à côté une variable indiquant la taille du tableau. Cela n'est valable que pour les chaînes de caractères (c'est-à-dire le type char*, qu'on peut aussi écrire char[]). Pour les autres types de tableaux, vous êtes toujours obligés de retenir la taille du tableau quelque part. Création et initialisation de la chaîne Si on veut initialiser notre tableau chaine avec le texte « Salut », on peut utiliser la méthode manuelle mais peu efficace : char chaine[6]; // Tableau de 6 char pour stocker S-a-l-u-t + le \0 chaine[0] = 'S'; L1TI 2 AU 2020/2021 S1 Moncef BH 6 chaine[1] = 'a'; chaine[2] = 'l'; chaine[3] = 'u'; chaine[4] = 't'; chaine[5] = '\0'; Cette méthode marche. On peut le vérifier avec un printf. Pour faire un printf il faut utiliser le symbole %s (s comme string}, qui signifie « chaîne » en anglais). Voici le code complet qui crée une chaîne « Salut » en mémoire et qui l'affiche : #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char chaine[6]; // Tableau de 6 char pour stocker S-a-l-u-t + le \0 // Initialisation de la chaîne (on écrit les caractères un à un en mémoire) chaine[0] = 'S'; chaine[1] = 'a'; chaine[2] = 'l'; chaine[3] = 'u'; chaine[4] = 't'; chaine[5] = '\0'; // Affichage de la chaîne grâce au %s du printf printf("%s", chaine); return 0; } Résultat : Salut Vous remarquerez que c'est un peu fatigant et répétitif de devoir écrire les caractères un à un comme on l'a fait dans le tableau chaine. Pour initialiser une chaîne, il existe heureusement une méthode plus simple : L1TI 2 AU 2020/2021 S1 Moncef BH 7 int main(int argc, char *argv[]) { char chaine[] = "Salut"; // La taille du tableau chaine est automatiquement calculée printf("%s", chaine); return 0; } Salut Comme vous le voyez à la première ligne, je crée une variable de type char[]. J'aurais pu écrire aussi char*, le résultat aurait été le même. En tapant entre guillemets la chaîne que vous voulez mettre dans votre tableau, le compilateur C calcule automatiquement la taille nécessaire. C'est-à-dire qu'il compte les lettres et ajoute 1 pour placer le caractère\0. Il écrit ensuite une à une les lettres du mot « Salut » en mémoire et ajoute le\0comme on l'a fait nous-mêmes manuellement quelques instants plus tôt. Bref, c'est bien plus pratique. Il y a toutefois un défaut : ça ne marche que pour l'initialisation ! Vous ne pouvez pas écrire plus loin dans le code : chaine = "Salut"; Cette technique est donc à réserver à l'initialisation. Après cela, il faudra écrire les caractères manuellement un à un en mémoire comme on l'a fait au début. Récupération d'une chaîne via un scanf Vous pouvez enregistrer une chaîne entrée par l'utilisateur via uploads/s3/ les-chaines-de-caracteres-en-c.pdf

  • 20
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager