Cours chaines caractères en c et algorithme comparaison asci

Cours chaines caractères en c et algorithme comparaison asci

Télécharger PDF

Les Chaînes de Caractères en C

Ce chapitre explore en détail les chaînes de caractères, leur définition, leur manipulation à l'aide de fonctions standard et leur utilisation dans des tableaux.

Plan du Chapitre

  • Introduction et définition
  • Fonctions sur les chaînes de caractères
  • Les tableaux de chaînes de caractères

Partie 1: Introduction et Définition

Qu'est-ce qu'une Chaîne de Caractères ?

Une chaîne de caractères est un tableau de caractères se terminant par le caractère nul ('\0'). Ce caractère spécial indique la fin de la chaîne.

Par exemple, "x" est une chaîne de caractères contenant deux caractères : 'x' et '\0'.

Déclaration

  • En langage algorithmique :

    NomVariable: chaîne[longueur]

  • En C :

    char <NomVariable> [Longueur+1];

    Le +1 est nécessaire pour réserver l'espace pour le caractère nul ('\0') qui marque la fin de la chaîne. Par conséquent, une chaîne de caractères de 'n' caractères significatifs occupe 'n+1' octets en mémoire.

Exemples de Déclaration

  • char PRENOM [20];
  • char NOM [20];
  • char PHRASE [100];

Précédence des Caractères (Ordre Lexicographique)

La précédence des caractères dépend du jeu de caractères utilisé (par exemple, ASCII). Pour le code ASCII, l'ordre général est le suivant :

... espace, !, ", #, ..., 0, 1, 2, ..., 9, ..., A, B, C, ..., Z, ..., a, b, c, ...

Exemples de Précédence

  • "ABC" précède "BCD" car 'A' < 'B'
  • "ABC" précède "B" car 'A' < 'B' (la comparaison se fait caractère par caractère, et la chaîne plus courte est considérée comme précédant si les préfixes sont identiques).
  • "Abc" précède "abc" car 'A' < 'a'
  • "ab" précède "abcd" (comparaison des préfixes identiques, puis la plus courte précède).
  • " " (espace) précède "ab" car ' ' < 'a'

Partie 2: Fonctions sur les Chaînes de Caractères

Fonctions de <stdio.h> pour les Chaînes

  • scanf("%s", chaine);

    Cette fonction lit une chaîne de caractères depuis l'entrée standard. Cependant, scanf s'arrête dès qu'elle rencontre un espace blanc (espace, tabulation, retour à la ligne). Les caractères saisis après le premier espace ne sont pas lus par scanf et restent dans le tampon d'entrée.

  • gets(chaine);

    Lit une ligne entière (y compris les espaces) jusqu'au caractère de nouvelle ligne. Attention : gets est considérée comme dangereuse car elle ne vérifie pas la taille du tampon et peut provoquer un débordement de tampon. Il est préférable d'utiliser fgets.

  • printf("%s", chaine);

    Affiche une chaîne de caractères sur la sortie standard.

  • puts(chaine);

    Affiche une chaîne de caractères suivie d'un retour à la ligne.

  • sprintf(chaine_destination, "format", arguments...);

    Formate des données (nombres, caractères, autres chaînes) dans une chaîne de caractères au lieu de les afficher sur la console. Par exemple, sprintf(buffer, "La valeur est %d", val);.

  • sscanf(chaine_source, "format", &variable...);

    C'est la version de scanf dédiée aux chaînes de caractères. Elle lit des données formatées non pas depuis l'entrée standard (stdin), mais depuis une chaîne de caractères existante. Par exemple, sscanf("17 H 35 min", "%d H %d min", &heure, &minute);.

Fonctions de <string.h> pour les Chaînes

  • strlen(s) :

    Fournit la longueur de la chaîne s, sans compter le caractère nul ('\0').

  • strcpy(s, t) :

    Copie la chaîne t (source) vers la chaîne s (destination). Le caractère nul ('\0') est également copié. Il est de la responsabilité du programmeur de s'assurer que s est suffisamment grande pour contenir t.

  • strncpy(s, t, n) :

    Copie les n premiers caractères de la chaîne t vers s. Si t a moins de n caractères, s est complétée par des caractères nuls. Si t a n caractères ou plus, strncpy ne garantit pas que s sera terminée par un '\0'.

  • strcat(s, t) :

    Concatène (ajoute) la chaîne t à la fin de la chaîne s. La concaténation commence à partir du caractère nul ('\0') de s, qui est écrasé. Assurez-vous que s a suffisamment d'espace.

  • strncat(s, t, n) :

    Concatène les n premiers caractères de t à la fin de s. Un caractère nul ('\0') est toujours ajouté à la fin.

  • strcmp(s, t) :

    Compare les chaînes s et t lexicographiquement (selon l'ordre ASCII). La fonction retourne :

    • Un nombre négatif si s précède t
    • Zéro si s est égal à t
    • Un nombre positif si s suit t
  • strncmp(s, t, n) :

    Compare les n premiers caractères des chaînes s et t lexicographiquement.

Rappel sur printf et scanf (Options de Formatage)

Options de Formatage pour printf

Des caractères spéciaux peuvent être insérés entre le symbole % et le caractère de conversion (par exemple, s pour chaîne, d pour entier).

  • Le signe - : Demande un cadrage à gauche (le cadrage est à droite par défaut).

  • Un nombre : Indique la taille minimale en caractères du champ à imprimer. Des espaces jouent le rôle de caractères de remplissage.

  • Un point décimal, suivi d'un nombre :

    • Pour les nombres flottants (par exemple, %f) : Spécifie le nombre de chiffres après le point décimal.
    • Pour les chaînes (par exemple, %s) : Spécifie la taille maximale du champ à imprimer.

Exemples avec printf

  • %8d : Imprime un nombre entier en décimal, cadré à droite. Si le nombre est 12345, la longueur du champ imprimable sera de huit caractères, avec trois espaces précédant le nombre.

    int x = 12345;

    printf("%8d", x); // affichera " 12345"

  • %-8d : Imprime un nombre entier en décimal, cadré à gauche.

    printf("%-8d", x); // affichera "12345 "

  • %-25s : Imprime une chaîne de caractères cadrée à gauche, assurant une longueur minimale de 25 caractères.

  • %.6f : Imprime un nombre flottant avec un maximum de six chiffres après la virgule.

Options de Formatage pour scanf

  • Pour limiter le nombre de caractères lus :

    Insérez un nombre entre le % et le caractère de conversion. Par exemple, %3s lira seulement les 3 premiers caractères d'une chaîne.

  • Le caractère * précédé de % :

    Spécifie que la valeur est lue mais non affectée à la variable suivante. Elle est ignorée.

    Exemple : scanf("%d%*s%d%*s%d%*s", &heure, &minute, &seconde);

    Cette instruction permet d'extraire correctement les données de la chaîne "17 H 35 min 30 secondes", puisque les chaînes " H ", " min " et " secondes " seront ignorées.

Fonctions de <stdlib.h> (Conversions Chaîne ↔ Nombre)

Conversion Chaîne vers Nombre

  • atoi(s) : Retourne la valeur numérique (entier) représentée par la chaîne s.

  • atol(s) : Retourne la valeur numérique (entier long) représentée par la chaîne s.

  • atof(s) : Retourne la valeur numérique (nombre flottant) représentée par la chaîne s.

Conversion Nombre vers Chaîne

Ces fonctions ne sont pas standard C, mais sont courantes dans de nombreux compilateurs.

  • itoa(n_int, s, b) : Convertit l'entier n_int en sa représentation textuelle dans la base b (entre 2 et 36), et stocke le résultat dans la chaîne s.

  • ltoa(n_long, s, b) : Idem pour un entier long n_long.

  • ultoa(n_uns_long, s, b) : Idem pour un entier long non signé n_uns_long.

Légende :

  • n_int : est un nombre de type int.
  • n_long : est un nombre de type long.
  • n_uns_long : est un nombre de type unsigned long.
  • s : est une chaîne de caractères (le tampon de destination).
  • b : est la base pour la conversion (de 2 à 36).

Partie 3: Les Tableaux de Chaînes de Caractères

Définition

Un tableau de chaînes de caractères correspond à un tableau bidimensionnel de caractères (char), où chaque "ligne" contient une chaîne de caractères individuelle.

Déclaration

char JOUR[7][9];

Cette déclaration réserve l'espace en mémoire pour 7 chaînes de caractères. Chaque chaîne peut contenir un maximum de 8 caractères significatifs, plus le caractère nul ('\0') (d'où la taille de 9 pour chaque ligne).

Initialisation

Les tableaux de chaînes sont mémorisés ligne par ligne.

Exemple :

char JOUR[7][9] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"};

La variable JOUR aura besoin de 7 * 9 * 1 = 63 octets en mémoire (pour un système où char = 1 octet).

Accès aux Éléments (Chaînes entières)

L'exécution des instructions suivantes :

char JOUR[7][9] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"};
int i = 2;
printf("Aujourd'hui, c'est %s !\n", JOUR[i]);

affichera la phrase : Aujourd'hui, c'est mercredi !

Affectation d'une Chaîne

L'attribution d'une nouvelle chaîne de caractères à une composante d'un tableau doit se faire à l'aide de la fonction strcpy, car une simple affectation avec = ne fonctionne pas pour les tableaux.

Exemple :

strcpy(JOUR[4], "Friday");

Cette commande changera le contenu de la 5ème composante du tableau JOUR, de "vendredi" à "Friday".

Accès aux Caractères Individuels

Il est possible d'accéder directement aux caractères qui composent les mots du tableau.

Exemple :

for(int i = 0; i < 7; i++) {
    printf("%c ", JOUR[i][0]);
}

Cette instruction va afficher les premières lettres des jours de la semaine : l m m j v s d

FAQ - Questions Fréquentes sur les Chaînes de Caractères en C

Q1 : Quelle est la principale caractéristique d'une chaîne de caractères en C ?

R1 : En C, une chaîne de caractères est un tableau de caractères qui est toujours terminé par un caractère nul ('\0'). Ce terminateur nul est essentiel pour que les fonctions standard de manipulation de chaînes (comme strlen ou strcpy) puissent déterminer la fin de la chaîne.

Q2 : Pourquoi utiliser strncpy plutôt que strcpy, et quelles sont les précautions à prendre ?

R2 : strncpy est généralement préférée à strcpy car elle permet de spécifier un nombre maximal de caractères à copier, aidant ainsi à prévenir les débordements de tampon. Cependant, il faut être vigilant : si la chaîne source est plus longue que le nombre de caractères spécifié, strncpy ne garantit pas que la chaîne de destination sera terminée par un '\0'. Il est souvent recommandé d'ajouter manuellement destination[n-1] = '\0'; après l'appel à strncpy pour assurer la terminaison.

Q3 : Comment déclare-t-on un tableau de chaînes de caractères en C, et comment l'initialise-t-on ?

R3 : Un tableau de chaînes de caractères est un tableau bidimensionnel de type char. Par exemple, char noms[5][20]; déclare un tableau pouvant contenir 5 chaînes, chacune d'une longueur maximale de 19 caractères plus le terminateur nul. On peut l'initialiser lors de la déclaration comme ceci : char noms[3][15] = {"Alice", "Bob", "Charlie"};. Les chaînes sont stockées ligne par ligne.

Cela peut vous intéresser :

Partagez vos remarques, questions , propositions d'amélioration ou d'autres cours à ajouter dans notre site

Enregistrer un commentaire (0)
Plus récente Plus ancienne