Contrairement à la majorité des langages modernes (Python, Java, C#) qui disposent d'un type d'objet natif string, le langage C ne possède aucun type primitif pour les chaînes de caractères.
En C, une chaîne de texte est simplement un tableau de caractères (char[]) qui se termine obligatoirement par un caractère spécial nul : '\0' (code ASCII 0). Ce caractère invisible est la borne sentinelle qui indique à toutes les fonctions de la bibliothèque standard où s'arrête la chaîne dans la mémoire vive.
1. La règle d'or du caractère sentinelle '\0'#
Pour stocker un mot de 5 lettres comme "BONJOUR", vous devez impérativement allouer un tableau d'au moins 8 cases (7 lettres + le caractère '\0') :
flowchart LR
subgraph Memoire [Mémoire RAM pour char mot[] = "BONJOUR"]
C0["mot[0]\n'B' (66)"] --- C1["mot[1]\n'O' (79)"]
C1 --- C2["mot[2]\n'N' (78)"]
C2 --- C3["mot[3]\n'J' (74)"]
C3 --- C4["mot[4]\n'O' (79)"]
C4 --- C5["mot[5]\n'U' (85)"]
C5 --- C6["mot[6]\n'R' (82)"]
C6 --- C7["mot[7]\n'\\0' (0)\nSENTINELLE"]
end
[!WARNING] Si une chaîne perd son caractère de terminaison
'\0', les fonctions d'affichage (printf("%s")) et de calcul de longueur (strlen()) continueront à lire les octets suivants de la mémoire RAM jusqu'à trouver un octet nul par hasard, provoquant l'affichage de caractères parasites aléatoires ou un crash de segmentation !
2. Littéral de chaîne vs Tableau de caractères modifiable#
Il existe une distinction capitale en C entre une chaîne littérale et un tableau modifiable :
1. Tableau de caractères modifiable sur la pile#
char nom[] = "AlgoJungle";
// Le compilateur alloue 11 octets sur la pile d'exécution.
nom[0] = 'a'; // PARFAITEMENT VALIDE : on peut modifier chaque lettre
2. Pointeur vers une constante littérale en mémoire texte#
const char *message = "AlgoJungle";
// "AlgoJungle" est stocké dans la zone mémoire .rodata (lecture seule du binaire).
// message[0] = 'a'; // CRASH IMMÉDIAT (Segmentation Fault) si on tente d'écrire !
[!TIP] Lorsque vous déclarez un pointeur vers une chaîne littérale entre guillemets, préfixez-le systématiquement du mot-clé
const(const char *str = "texte";) pour que le compilateur vous avertisse dès la compilation si vous tentez accidentellement de modifier son contenu.
Sommaire de la Partie 6#
- Entrées et Sorties de chaînes : fgets(), printf() et puts()
- Manipulations avec la bibliothèque
<string.h>(strlen, strcpy, strcmp, strcat) - Applications pratiques : Palindromes, Analyseur de texte et Chiffrement
Découvrons dans le chapitre suivant comment saisir et afficher des chaînes de texte de façon sécurisée.
Commentaires