Institut Galil´ee Architecture, Syst`eme
Ann´ee 2009-2010 Licence 2
T.P. 5
Chaˆınes de caract` eres
Ce TP traitera des sujets suivants : 1. manipulation de chaˆınes de caract`eres 2. allocation dynamique
Rappels
Chaˆınes de caract` eres
Une chaˆıne de caract`eres est cod´ee en langage C par un tableau de caract`eres.
Le dernier caract`ere de la chaˆıne est suivi du caract`ere ’\0 ’, qui signifie ’fin de chaˆıne’.
Par exemple, la chaˆıne ”bonjour” sera stoqu´ee dans un tableau de la sorte :
b o n j o u r \0
Rappelons qu’en langage C, les tableaux commen¸cent `a l’indice 0.
Tableau statique
Une chaˆıne de caract`ere se d´eclare par tableau statique en langage C de la mani`ere suivante :
char tab[MAX] ;
On ne peut cependant pas affecter par la suite une chaˆıne `a la variable tab.
En revanche, C autorise l’initialisation de diff´erentes mani`eres au moment de la d´eclaration :
char tab[MAX] = ”bonjour” ;
char tab[MAX] ={’b’, ’o’, ’n’, ’j’, ’o’, ’u’, ’r’, ’\0’};
Notons que le langage C autorise l’omission de la taille du tableau lors de sa d´eclaration si elle est accompagn´ee d’une initialisation, on peut alors ´ecrire :
char tab[] = ”bonjour” ;
Un tel tableau est dit ’statique’ car il est r´eserv´e d`es le d´ebut de l’ex´ecution d’un bloc.
Parmi les inconv´enients de l’allocation statique de tableaux, on trouve essentiel- lement les deux suivantes :
– La taille de certains objets ne peut ˆetre connue avant l’ex´ecution du pro- gramme. On doit alors r´eserver un espace suffisement grand, espace qui est souvent soit trop grand, soit trop petit.
– L’espace allou´e de mani`ere statique se situe dans la pile d’ex´ecution qui a une taille tr`es limit´ee. Cela empˆeche les objets statiques d’ˆetre trop grands ou trop nombreux.
1
Allocation dynamique
Une solution au probl`eme pr´ec´edant consiste en l’allocation dite ’dynamique’.
Dans ce cas, l’espace est r´eserv´e dans le tas (de bien plus grande taille que la pile) lors de l’ex´ecution (ce qui permet de connaˆıtre la taille effectivement n´ecessaire).
Les fonctions qui seront d´ecrites ici appartiennent toutes au fichier d’en-tˆete stdlib.h.
L’allocation dynamique de m´emoire en C peut ˆetre r´ealis´ee via deux fonctions : malloc() etcalloc().
La fonctionmalloc() a la signature suivante : void∗ malloc(size t t);
Cette fonction demande au syst`eme d’exploitation un bloc de taille t (en octets) et renvoie un pointeur vers l’adresse du bloc allou´e. S’il se produit une erreur, typiquement s’il n’y a plus de m´emoire disponible, la fonction retourne la valeurNULL.
Exemple d’utilisation :
int∗p= (int∗)malloc(sizeof(int));
La fonction retourne une adresse non typ´ee que l’on convertit en (int ∗).
L’op´erateur sizeof() permet de connaˆıtre la taille en octet du type donn´e en argument.
Pour allouer un tableau denchar, on proc`ede comme suit : char∗t= (char∗)malloc(n∗sizeof(char));
Une seconde mani`ere d’allouer dynamiquement est par la m´ethodecalloc, de signature :
void∗calloc (size t n, size t t);
La fonction allouenblocs de taillet, elle est donc ´equivalente `a l’appel suivant : malloc (n∗t);
La seule diff´erence r´eside dans le contenu des cases allou´ees. Avec la fonction malloc le contenu est totalement al´eatoire, tandis qu’avec la fonctioncalloc les cases contiennent des valeurs nulles.
Apr`es utilisation, il faut toujours lib´erer l’espace m´emoire allou´e dynami- quement en appelant la fonctionfree :
char∗t= (char∗)malloc(n∗sizeof(char));
. . . free(t) ;
2
Exercices
Exercice 1 :A l’aide de la fonction` getchar(),´ecrire une fonction void read str(char tab[], unsigned int size);
qui lit une chaˆıne de caract`eres saisie par l’utilisateur. Le caract`ere ’\n’
indiquera la fin de la saisie. Si la chaˆıne saisie par l’utilisateur est plus grande que le tableau donn´e en argument, elle sera coup´ee.
Rappelons qu’une chaˆıne de caract`ere doit se terminer par le caract`ere ’\0’.
Exercice 2 :Ecrire une fonction´
unsigned int str length(char tab[]);
qui retourne la longueur de la chaˆıne de caract`ere donn´ee en argument. On supposera que le tableau contient le caract`ere ’\0’.
Notons que l’on ne compte pas ’\0’ dans la taille de la chaˆıne.
Exercice 3 :Ecrire une fonction´
unsigned int str equal(char tab1[], char tab2[]);
qui retourne 1 si les chaˆınes donn´ees en argument sont identiques, et 0 sinon.
Il faut comparer les contenus des tableaux, et non les pointeurs.
Exercice 4 :Ecrire une fonction´
char∗str concat(char tab1[], char tab2[]);
qui concat`ene deux chaˆınes donn´ees en arguments, et retourne la nouvelle chaˆıne cr´e´ee. La nouvelle chaˆıne, allou´ee dynamiquement, ne devra pas ˆetre plus grande que n´ecessaire.
En cas d’erreur d’allocation, la fonction devra retourner le pointeurNULL.
Il faudra lib´erer l’espace allou´e dynamiquement avant de quitter le programme.
Exercice 5 :Ecrire une fonction´
char∗str reverse(char tab[]);
qui inverse une chaˆıne de caract`eres et met le r´esultat dans une autre. La nouvelle chaˆıne, allou´ee dynamiquement, devra ˆetre retourn´ee.
En cas d’erreur d’allocation, la fonction devra retourner le pointeurNULL.
Il faudra lib´erer l’espace allou´e dynamiquement avant de quitter le programme.
Exercice 6 :Palindrome
Un palindrome est une suite de caract`ere qui se lit de la mˆeme fa¸con dans les deux sens (exemple : laval, radar, ´et´e, ressasser,. . .)
a) A l’aide de la fonction` str reverse, ´ecrire une fonction unsigned int palindrome(char tab[]);
qui retourne 1 si la chaˆıne donn´ee est un palindrome, et 0 sinon.
b) Ecrire une fonction´
unsigned int palindrome2(char tab[]);
qui ne cr´ee pas de chaˆıne interm´ediaire.
3