Chaînes de caractères
Approfondir : Chaînes de caractères
Une chaîne C est une suite de caractères terminée par un caractère nul, écrit '\0'. Ce terminateur permet aux fonctions de retrouver sa fin. La capacité du tableau qui la stocke doit inclure cet élément supplémentaire.
Texte, longueur et capacité
char mot[6]="panda"; stocke cinq lettres et le nul final. strlen(mot) vaut 5, tandis que sizeof mot vaut 6 dans cette portée. Un tableau de six caractères qui ne contient aucun nul n’est pas une chaîne valide pour strlen ou printf avec %s. La longueur compte les octets avant le nul, pas nécessairement les caractères perçus par un lecteur : un texte UTF-8 peut utiliser plusieurs octets par caractère.
Lire avec une borne
fgets reçoit le tableau, sa capacité et le flux. Si elle réussit, elle termine le texte lu par un nul ; elle conserve aussi le retour à la ligne lorsqu’il tient dans le tableau. Un retour NULL doit être traité avant toute utilisation du contenu. Si la ligne dépasse la capacité, fgets ne lit qu’un préfixe et laisse la suite dans le flux. Le programme ci-dessous présente explicitement ce préfixe borné ; il ne prétend pas valider une ligne arbitrairement longue.
Enlever seulement le retour à la ligne
texte[strcspn(texte,"\n")]='\0'; remplace le premier saut de ligne par un nul. S’il n’y a pas de saut de ligne, strcspn renvoie la longueur de la chaîne et l’affectation remet un nul à sa place déjà valide. Ne pas écrire aveuglément texte[strlen(texte)-1]='\0' : cela supprimerait une lettre en l’absence de saut de ligne.
Comparer le contenu
strcmp(a,b)==0 signifie que les deux chaînes ont le même contenu. Les opérateurs == sur des pointeurs comparent des adresses, pas les lettres. Le résultat de strcmp est négatif, nul ou positif ; il ne faut pas supposer qu’il vaut exactement -1 ou 1. Les comparaisons restent sensibles à la casse et ne sont pas un classement linguistique universel.
Modifier et copier
Un tableau initialisé par une chaîne est modifiable dans ses limites. Un pointeur vers un littéral doit être utilisé sans modifier le littéral, par exemple const char *nom="Ada";. Avant toute copie ou concaténation, vérifier la capacité de destination en incluant le nul. Éviter les lectures %s sans largeur et ne jamais employer gets ; elles ne fournissent pas la borne nécessaire.
Pour une lecture de ligne complète, contrôler aussi la présence du saut de ligne et traiter explicitement une éventuelle suite non lue. Le préfixe de démonstration est volontairement nommé comme tel pour ne pas confondre limitation de mémoire et validation de la saisie.
Chaînes : lire un préfixe borné
#include <stdio.h>
#include <string.h>
int main(void) {
char nom[32];
puts("Entrer un nom (prefixe de 31 octets maximum) :");
if (fgets(nom, sizeof nom, stdin) == NULL) {
puts("Lecture impossible.");
return 1;
}
nom[strcspn(nom, "\n")] = '\0';
printf("Texte = %s\n", nom);
printf("Longueur en octets = %zu\n", strlen(nom));
if (strcmp(nom, "Ada") == 0) { puts("Bonjour Ada."); }
return 0;
}| Instruction ou étape | Explication |
|---|---|
| char nom[32] | Réserve 32 octets, donc au plus 31 octets de texte plus le terminateur. |
| fgets | Lit de façon bornée et permet des espaces dans le texte. |
| strcspn | Trouve le saut de ligne ; on le remplace par le nul final. |
| strlen et strcmp | Pour Ada, longueur 3 et comparaison nulle : le message est affiché. |
Sortie écran : essai 1
Les trois lettres précèdent le nul final.
Entrer un nom (prefixe de 31 octets maximum) :
Ada
Texte = Ada
Longueur en octets = 3
Bonjour Ada.Sortie écran : essai 2
L’espace fait partie de la chaîne.
Entrer un nom (prefixe de 31 octets maximum) :
Jean Paul
Texte = Jean Paul
Longueur en octets = 9S’entraîner et vérifier
Exercice 1. Combien de cases faut-il pour stocker "bonjour" ?
Voir la correctionMasquer la correction
Huit : sept lettres et le nul final. strlen donne 7, pas 8.
Exercice 2. Pourquoi mot=="Ada" ne vérifie-t-il pas le nom ?
Voir la correctionMasquer la correction
La comparaison porte sur les adresses obtenues à partir des tableaux, pas sur leurs éléments. Utiliser strcmp et vérifier que son résultat est nul.
Pratiquer avec le TD/TP 1 corrigé · Tous les exercices C.
Repère de lecture : les codes proposés utilisent des constructions disponibles en C11. Les règles du langage et de sa bibliothèque sont consultables dans les projets publics du WG14 (C11) et du WG14 (C23). Les exemples n’utilisent pas les nouveautés propres à C23.
Questions / Réponses
Ajouter un commentaire