• Aucun résultat trouvé

Tableaustatique Chaˆınesdecaract`eres Rappels Chaˆınesdecaract`eres T.P.5

N/A
N/A
Protected

Academic year: 2022

Partager "Tableaustatique Chaˆınesdecaract`eres Rappels Chaˆınesdecaract`eres T.P.5"

Copied!
3
0
0

Texte intégral

(1)

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

(2)

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

(3)

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

Références

Documents relatifs

Calculer le rayon de convergence et la somme des s´ eries enti` eres suivantes

„ Identifier la valeur inconnue dans l’énoncé d’un problème, représenter le problème sous la forme d’une équation, puis résoudre le problème, de façon concrète, imagée ou

Les indicateurs qui suivent peuvent servir à déterminer si l’élève a bien atteint le résultat d’apprentissage spécifique

Les indicateurs qui suivent peuvent servir à déterminer si l’élève a bien atteint le résultat d’apprentissage spécifique

Les indicateurs qui suivent peuvent servir à déterminer si l’élève a bien atteint le résultat d’apprentissage spécifique

„ Résoudre un problème comportant le pourcentage d’un pourcentage tel que : une population a augmenté de 10 % une année et de 15 % l’année suivante. Explique pourquoi il

Les indicateurs qui suivent peuvent servir à déterminer si l’élève a bien atteint le résultat d’apprentissage spécifique

Les indicateurs qui suivent peuvent servir à déterminer si l’élève a bien atteint le résultat d’apprentissage spécifique