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 type char. 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).






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 \0 permet 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 5 char, 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 \0 est une source d'erreurs impitoyable du langage C.

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 \0 comme 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';

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 :

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 \0 comme 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 un scanf, en utilisant là encore le symbole %s.
Seul problème : vous ne savez pas combien de caractères l'utilisateur va entrer. Si vous lui demandez son prénom, il s'appelle peut-être Luc (3 caractères), mais qui vous dit qu'il ne s'appelle pas Jean-Edouard (beaucoup plus de caractères) ?

Pour ça, il n'y a pas 36 solutions. Il va falloir créer un tableau de char très grand, suffisamment grand pour pouvoir stocker le prénom. On va donc créer un char[100]. Vous avez peut-être l'impression de gâcher de la mémoire, mais souvenez-vous encore une fois que de la place en mémoire, ce n'est pas ce qui manque (et il y a des programmes qui gâchent la mémoire de façon bien pire que cela !).

int main(int argc, char *argv[])

{

    char prenom[100];

   

    printf("Comment t'appelles-tu ? ");

    scanf("%s", prenom);

    printf("Salut %s, je suis heureux de te rencontrer !", prenom);

   

    return 0;

}



Comment t'appelles-tu ? Vador


SalutVador, je suis heureux de te rencontrer !

Créé avec HelpNDoc Personal Edition: Écrire des livres électroniques ePub pour l'iPad