Caractères Chaines de Caractères TP Programmation en C: // Les caractères et chaines de caractères Saadi Mostafa ENSA Khouribgha Maroc 29/11/2017 Saadi Mostafa Programmation en C: // Les caractères et chaines de caractères Caractères Chaines de Caractères TP Introduction Représentation : par un code de caractère : historiquement : sur 7 bits ⇒ 128 codes, de nos jours : sur 8 bits ⇒ 256 codes. Les caractères regroupent : codes 0 à 127 : standard ASCII : 32 à 126 : 95 symboles affichables, 0 à 31 et 127 : 33 caractères de contrôle, codes 128 à 255 : symboles affichables étendus : de nombreux standard existent : latin1 : ISO pour l’Europe de l’ouest, Mac-Roman : Europe de l’ouest sur les Macintoshs, UTF-8 : standard universel Unicode, En C : type char. Saadi Mostafa Programmation en C: // Les caractères et chaines de caractères Caractères Chaines de Caractères TP Arithmétiques sur les caractères Remarques char est un entier l’ASCII est organisé en plages logiques (A à Z, etc.) =⇒ on peut faire de l’arithmétique sur les caractères. Exemple : mettre en majuscule char enMajuscule(char c) { if ( c >= ’a’ & & c <= ’z’ ) return c - ’a’ + ’A’; else return c; } Saadi Mostafa Programmation en C: // Les caractères et chaines de caractères Caractères Chaines de Caractères TP Représentation des chaı̂nes de caractères Chaı̂ne (string) = suite de caractères terminée par le caractère \ 0. En C, pas de type chaı̂ne spécifique : déclaration : on utilise un tableau de char : char[], en argument : on passe un pointeur dans un tableau : char*. Saadi Mostafa Programmation en C: // Les caractères et chaines de caractères Caractères Chaines de Caractères TP Déclaration des chaines Exemples char buf[1024] : Dangereux ça terminent pas par \0 char cc[] = { ’H’, ’e’, ’l’, ’l’, ’o’, ’ !’, 0}; char toto[4] = { ’H’, ’i’, ’\ 0’ }; char titi[4] = { ’H’, ’i’ }; Remarque Rappel des règles sur les initialisations de tableaux : avec [], la taille est calculée automatiquement, sinon, les initialiseurs manquants sont mis à 0. Saadi Mostafa Programmation en C: // Les caractères et chaines de caractères Caractères Chaines de Caractères TP Déclaration et chaines Initialisation par une chaı̂ne littérale entre ” ” Examples char cc[] = ”Hello!”; char toto[4] = ”Hi”; La chaine de caractère est un tableau de caractère, on peut la manipuler avec un pointeur comme les autres tableaux. Saadi Mostafa Programmation en C: // Les caractères et chaines de caractères Caractères Chaines de Caractères TP Utilisation des pointeurs Pointeur On peut attribuer l’adresse d’une chaı̂ne de caractères constante à un pointeur sur char: char *C; C = ”Ceci est une chaı̂ne de caractères constante”; Remarque Il existe une différence importante entre les deux déclarations: char A[] = ”Bonjour !”; /* un tableau */ A est un tableau qui a exactement la grandeur pour contenir la chaı̂ne de caractères et la terminaison ’\0’. Les caractères de la chaı̂ne peuvent être changés, mais le nom A va toujours pointer sur la même adresse en mémoire. char *B = ”Bonjour !”; /* un pointeur */ B est un pointeur qui est initialisé de façon à ce qu’il pointe sur une chaı̂ne de caractères constante stockée quelque part en mémoire. Le pointeur peut être modifié et pointer sur autre chose. La chaı̂ne constante peut être lue Saadi Mostafa Programmation en C: // Les caractères et chaines de caractères Caractères Chaines de Caractères TP Exemple Exemple 1 char *A = ”Petite chaı̂ne”; char *B = ”Deuxième chaı̂ne un peu plus longue”; A = B; Maintenant A et B pointent sur la même chaı̂ne; la ”Petite chaı̂ne” est perdue Exemple 2 char char char A= C= A[45] = ”Petite chaı̂ne”; B[45] = ”Deuxième chaı̂ne un peu plus longue”; C[30]; B; /* ERREUR !!! */ ”Bonjour !”; /* ERREUR !!! */ Saadi Mostafa Programmation en C: // Les caractères et chaines de caractères Caractères Chaines de Caractères TP Résumé Utilisons des tableaux de caractères pour déclarer les chaı̂nes de caractères que nous voulons modifier. Utilisons des pointeurs sur char pour manipuler des chaı̂nes de caractères constantes (dont le contenu ne change pas). Utilisons de préférence des pointeurs pour effectuer les manipulations à l’intérieur des tableaux de caractères. Saadi Mostafa Programmation en C: // Les caractères et chaines de caractères Caractères Chaines de Caractères TP Passage par paramètre Les chaı̂nes sont passées aux fonctions par référence sous forme de pointeur vers le premier caractère. Type de l’argument : char* si la chaı̂ne risque d’être modifiée par la fonction, const char* si la chaı̂ne n’est pas modifiée. Exemple int longueur(const char* s) { int i = 0; while (s[i]) i++; return i; } Saadi Mostafa Programmation en C: // Les caractères et chaines de caractères Caractères Chaines de Caractères TP Autre exemple char enMajuscule(char c) { if ( c >= ’a’ & & c <= ’z’ ) return c - ’a’ + ’A’; else return c; } void chaineEnMajuscule(char* s) { for ( ; *s; s++ ) *s = enMajuscule(*s); } Saadi Mostafa Programmation en C: // Les caractères et chaines de caractères Caractères Chaines de Caractères TP Fonctions sur les chaines Fonctions La bibliothèque ¡string.h¿ contient plusieurs fonctions pour manipuler des chaines de caractères , nous avons par exemple : int strlen (const char * str) : longueur d’une chaı̂ne int strcmp(const char * chaine1, const char * chaine2) : compare deux chaı̂nes lexicographiquement. Elle renvoie une valeur négative si la première chaine est plus petite que la deuxième, zéro si elles sont égaux et une valeur positive si la première est plus grande. char * strcpy(char * dest, const char * src) : copie de chaı̂ne src dans la chaine dest et renvoie l’adresse de dest. char * strcat(char * dest, const char * src) : concaténation deux chaı̂nes et renvoie l’adresse de la nouvelle chaine. Saadi Mostafa Programmation en C: // Les caractères et chaines de caractères Caractères Chaines de Caractères TP Exercices Exercice 1 Programmez une fonction qui prend une chaı̂ne de caractères en argument et renvoie 1 si c’est un palindrome (mot symétrique, qui s’écrit de la même manière de gauche à droite et de droite à gauche). Exercice 2 Programmez une fonction :// void myStrcat(char *dest, const char *src); qui simule le comportement de strcat.// Que fait votre fonction si dest et src pointent dans le même tableau ? Exercice 3 Programmez une fonction :// void insert(char ∗dest, const char∗src, int pos); qui insère src à la position pos de dest. Les caractères de dest à partir de la position pos sont donc décalés de la longueur de src.// La fonction suppose que src et dest ne pointent pas dans le même tableau et vérifie que pos est compris entre 0 et strlen(dest) inclus. Saadi Mostafa Programmation en C: // Les caractères et chaines de caractères