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.