TP8 – Les chaines de caractères
Transcription
TP8 – Les chaines de caractères
Deug MP1 Compléments de Programmation Impérative 2003/2004 TP8 – Les chaines de caractères Objectifs : • Manipulation de chaines de caractères (déclaration, initialisation, affectation) • Introduction à la bibliothèque string.h A) GÉNÉRALITÉS En C, il n'existe pas de type de base pour représenter les chaines de caractères. Par convention, on déclare une chaine de caractères comme un tableau de caractères terminé par le caractère ' \0'. Déclaration char ch[20] ; ch est un tableau de 20 caractères. S'il est considéré comme un chaîne, c'est une chaine de 19 caractères. Ici, la chaine n'est pas initialisée. Déclaration et initialisation char ch [] = "bonjour"; est équivalent à char ch [] = {'b','o','n','j','o','u','r','\0'}; Le tableau est automatiquement initialisé à la longueur 8, il représente une chaine de 7 caractères. Attention : L'affectation de tableaux est interdite, l'instruction ch = "salut"; est donc illégale. Pour faire une telle opération, il faut affecter les caractères 1 à 1 ; ch[0]='s'; ch[1]='a'; ch[2]='l'; ch[3]='u'; ch[4]='t'; ch[5]='\0'; Le tableau ch est maintenant un tableau de taille 8 qui représente une chaine de 5 caractères. Comme ch a été déclaré avec une taille initiale de 8 caractères, ce tableau ne permettra jamais de représenter des chaines de plus de 7 caractères. Attention donc aux valeurs initiales choisies. B) PRINTF ET SCANF Avant d'aller plus loin, on aura vraisemblablement besoin de saisir des chaines de caractères au clavier et de les afficher. Les fonctions printf et scanf sont équipées pour cela, il suffit en fait d'utiliser le spécificateur de format %s. Exemple : printf("La chaine ch est %s\n", ch); scanf("%s", &ch); // saisit une chaine sans espace scanf("%29s", &ch); // saisit au maximum 29 caractères (tableau de longueur 30) Attention le paramètre attendu/rendu est un tableau de char terminé par '\0'. Il y a beaucoup d'opérations classiques (calcul de la taille, copie, ...) que l'on souhaite réaliser sur les chaines de caractères, il serait fastidieux de réécrire toutes ces opérations à chaque fois qu'on en a besoin, on va donc écrire notre bibliothèque de fonctions sur les chaines de caractères. Deug MP1 Compléments de Programmation Impérative 2003/2004 C) NOTRE PROPRE BIBLIOTHÈQUE: CHAINE.C Exercice 8.1 : Ecrire une fonction strLongueur qui calcule la taille d'une chaine de caractères. int strLongueur(char c[]) ; Note : Il n'y a aucun moyen en C pour garantir que le paramètre c soit effectivement une chaine de caractères (terminé par '\0'). Cela pourrait très bien être un simple tableau. Exercice 8.2 : Ecrire en C une fonction qui copie une chaine de caractères src dans une autre dst. Il s'agit simplement de copier caractère par caractère. On renverra le nombre de caractères copiés. int strCopie(char dst[], char src[]); Exercice 8.3 : Ecrire en C une fonction qui compare deux chaines de caractères (ordre lexicographique « du dictionnaire »). int strCompare(char cd1[], char ch2[]); Cette fonction renverra la valeur 0 si les deux chaines sont égales, une valeur négative si ch1 est inférieure à ch2, une valeur positive sinon. Attention, les chaines n'ont pas nécessairement la même longueur. Exercice 8.4 : Ecrire en C une fonction qui lit au clavier une ligne de caractères (terminée par le caractère '\n') et affecte la chaine de caractères fournie en paramètre. void lireChaine(char ch[], int max); Le paramètre max contient le nombre maximum de caractères pouvant être contenus dans le tableau ch (attention, il faut prévoir une place pour '\0'). Le tableau ch n'est pas nécessairement initialisé, après l'appel de la fonction, il doit contenir la ligne lue au clavier : une chaine de caractères. Attention : Ne pas utiliser la fonction scanf qui ne permet de lire que des chaines de caractères sans caractères d'espacement (espace, tabulation, ...). Il faut donc lire caractère par caractère (e.g. getchar) jusqu'à '\n'. LA BIBLIOTHÈQUE STRING.H La plupart des fonctions que nous venons d'écrire l'avait déjà été pour nous. Ces fonctions sont déclarées dans le fichier string.h qu'il suffit donc d'inclure (#include) lorsqu'on souhaite utiliser des chaines de caractères. Les équivalents les plus proches des fonctions écrites sont : int strlen(char s[]); // calcul de la longueur void strcpy(char dst[], char src[]) ; // copie int strcmp(char s1[], char s2[]); // comparaison lexicographique void gets(char s[]); // lire une ligne de caractères Exercice 8.5 : Utiliser les programmes de test écrits pour vos propres fonctions afin de tester l'utilisation des fonctions de la bibliothèque string.h. EXERCICE SUPPLÉMENTAIRE Exerice 8.6 : Ecrire en C une fonction qui compare deux chaines de caractères en ignorant les différences entre majuscules et minuscules (e.g. "bonjour" sera égal à "Bonjour"). On peut , par exemple, transformer les caractères en majuscules (ou en minuscules) avant la comparaison.