Les chaînes : des tableaux de char
Comment le C représente le texte, lire un mot ou une ligne entière, et parcourir une chaîne.
Ce que tu vas apprendre
- Comprendre le caractère de fin de chaîne
'\0' - Lire un mot avec
scanfet une ligne avecfgets - Parcourir une chaîne caractère par caractère
Un tableau terminé par '\0'
En C, une chaîne est un tableau de char qui se termine par le caractère spécial '\0' (de code 0). Le mot « chat » occupe donc 5 cases : 'c' 'h' 'a' 't' '\0'.
C'est ce '\0' qui indique où le texte s'arrête : on ne stocke pas la longueur. Prévois toujours une case de plus que le nombre de lettres.
Lire un mot ou une ligne
scanf("%99s", mot) lit un mot : il s'arrête au premier espace. Pour une ligne entière avec ses espaces, on utilise fgets(ligne, sizeof ligne, stdin).
fgets garde le retour à la ligne final s'il y en a un. On le retire avec ligne[strcspn(ligne, "\n")] = '\0'; (fonction de <string.h>).
Parcourir une chaîne
On parcourt les caractères jusqu'au '\0' : for (int i = 0; s[i] != '\0'; i++). strlen(s) (dans <string.h>) donne la longueur, sans compter le '\0'.
Exemples commentés
1.Un caractère par ligne
#include <stdio.h>
int main(void) {
char mot[100];
scanf("%99s", mot);
for (int i = 0; mot[i] != '\0'; i++) { // jusqu'à la fin de chaîne
printf("%c\n", mot[i]);
}
return 0;
}Entrée
chat
Sortie
c h a t
La boucle s'arrête sur le '\0' placé automatiquement par scanf après la dernière lettre.
2.Lire une ligne complète
#include <stdio.h>
#include <string.h>
int main(void) {
char ligne[200];
if (fgets(ligne, sizeof ligne, stdin) == NULL) {
return 0; // rien à lire
}
ligne[strcspn(ligne, "\n")] = '\0'; // retire le retour à la ligne
printf("[%s] %zu caracteres\n", ligne, strlen(ligne));
return 0;
}Entrée
bonjour tout le monde
Sortie
[bonjour tout le monde] 21 caracteres
fgets garde les espaces. Les crochets montrent que le retour à la ligne a bien été retiré. %zu affiche le résultat de strlen.
Chaque exemple est compilé et exécuté automatiquement pour garantir la sortie affichée.
Erreurs fréquentes
Oublier la place du '\0'
À éviter
char mot[4]; // pour "chat"
À préférer
char mot[5]; // 4 lettres + '\0'
Sans place pour le '\0', la chaîne déborde sur la mémoire voisine.
Utiliser scanf pour une phrase
scanf("%s") s'arrête au premier espace : « bonjour tout » ne donne que « bonjour ». Pour une ligne, utilise fgets.
Comparer deux chaînes avec ==
À éviter
if (mot == "oui")
À préférer
if (strcmp(mot, "oui") == 0)
== compare des adresses, pas le texte. La leçon sur string.h présente strcmp.
Entraîne-toi
6 questions variées pour fixer la leçon : choix, résultat à prévoir, ligne à compléter, code à remettre dans l'ordre, erreur à trouver.
À toi de jouer !
3 exercices pour mettre cette leçon en pratique, du plus simple au plus avancé.