Cours chaines caractères en c et algorithme comparaison asci
Télécharger PDFLes 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
+1est 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,
scanfs'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 parscanfet 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 :
getsest 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'utiliserfgets. -
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
scanfdé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înes(destination). Le caractère nul ('\0') est également copié. Il est de la responsabilité du programmeur de s'assurer quesest suffisamment grande pour contenirt. -
strncpy(s, t, n):Copie les
npremiers caractères de la chaînetverss. Sita moins dencaractères,sest complétée par des caractères nuls. Sitancaractères ou plus,strncpyne garantit pas quessera terminée par un '\0'. -
strcat(s, t):Concatène (ajoute) la chaîne
tà la fin de la chaînes. La concaténation commence à partir du caractère nul ('\0') des, qui est écrasé. Assurez-vous quesa suffisamment d'espace. -
strncat(s, t, n):Concatène les
npremiers caractères detà la fin des. Un caractère nul ('\0') est toujours ajouté à la fin. -
strcmp(s, t):Compare les chaînes
settlexicographiquement (selon l'ordre ASCII). La fonction retourne :- Un nombre négatif si
sprécèdet - Zéro si
sest égal àt - Un nombre positif si
ssuitt
- Un nombre négatif si
-
strncmp(s, t, n):Compare les
npremiers caractères des chaînessettlexicographiquement.
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.
- Pour les nombres flottants (par exemple,
Exemples avec printf
-
%8d: Imprime un nombre entier en décimal, cadré à droite. Si le nombre est12345, 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,%3slira 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înes. -
atol(s): Retourne la valeur numérique (entier long) représentée par la chaînes. -
atof(s): Retourne la valeur numérique (nombre flottant) représentée par la chaînes.
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'entiern_inten sa représentation textuelle dans la baseb(entre 2 et 36), et stocke le résultat dans la chaînes. -
ltoa(n_long, s, b): Idem pour un entier longn_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 typeint.n_long: est un nombre de typelong.n_uns_long: est un nombre de typeunsigned 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.