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;
}
Suivre le programme : Chaînes, lire un préfixe borné
Instruction ou étapeExplication
char nom[32]Réserve 32 octets, donc au plus 31 octets de texte plus le terminateur.
fgetsLit de façon bornée et permet des espaces dans le texte.
strcspnTrouve le saut de ligne ; on le remplace par le nul final.
strlen et strcmpPour 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 = 9

S’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

Aucune question. Soyez le premier à poser une question.
★ ★ ★ ★ ★
2 votes. Moyenne 5 sur 5.

Ajouter un commentaire

Anti-spam