Skip to topic | Skip to bottom
Home
Linfo
Linfo.CTPSurChainesr1.2 - 17 Nov 2004 - 10:31 - MichelBuffatopic end

Start of topic | Skip to actions

Pointeurs et chaînes de caractères

Auteur : Carine Fedele

Les pointeurs, ça se promène dans la mémoire...

Passage des paramètres

  • Copiez le programme caracteres.c.
  • Compilez grâce à "make caracteres" et exécutez.

Après l'appel à la procédure majCar, la valeur de la variable car n'a pas été modifiée: ce qui est tout à fait normal, car en C, le passage des paramètres se fait par valeur.

Après l'appel à la fonction majCarF, la valeur de la variable car n'a toujours pas été modifiée: en fait, c'est la valeur renvoyée par la fonction qui est la majuscule du paramètre. Si on veut vraiment modifier la valeur d'une variable, il faut utiliser le passage des paramètres par référence: procédure majCarP.

Le paramètre c est en fait un pointeur sur char, et dans la procédure on «touche» à *c. L'appel à la procédure majCarPbis n'a aucun effet sur la valeur de car, car la première instruction de cette procédure est de «toucher» à c par un malloc: on a donc perdu la référence au paramètre effectif car...

Travail à faire

  1. Écrivez une procédure ecrireChaine, qui écrit sur la sortie standard le contenu d'une chaîne passée en paramètre, caractère par caractère. On supposera que cette chaîne suit la convention de C, c'est-à-dire que c'est un tableau de caractères se terminant par '\0'. Testez-la.

  1. Écrivez une procédure majChaine, qui met en majuscules le contenu de la chaîne passée en paramètre. Testez-la.

  1. Écrivez maintenant une fonction majChaineF, qui renvoie la chaîne en majuscules, sans modifier la chaîne passée en paramètre. Il y aura donc forcément une allocation. Testez-la, puis écrivez la procédure majChaineP correspondante: on ne peut donc plus renvoyer la chaîne, il faut la passer par référence... N'ayez pas peur des **! Et si vous voulez, vous pouvez écrire sur la sortie standard des adresses grâce au format %p de la fonction fprintf...

Voici une solution...

Ecriture d'une bibliothèque

Voici un fichier de déclarations chaines.h qui regroupe différents sous-programmes traitant le type chaîne.

  • Vous devez écrire le fichier chaines.c correspondant (n'oubliez pas la fonction qui teste tout ça). Chaque sous-programme se charge de l'allocation de la chaîne résultat s'il y a lieu. La comparaison des chaînes se fait de façon lexicographique.

Voici une solution

Et une solution avec des procédures :

strcat et strcpy

  • Récupérez le fichier myStringsFunctions.c, il contient le corps (vide) des deux fonctions que vous allez écrire dans cette partie du TP, ainsi qu'un main pour les tester en comparant les résultats avec les "vraies" fonctions disponibles en incluant "strings.h".
  • Ecrivez le corps des fonctions my_strcat et my_strcpy qui sont les répliques exactes des fonctions strcat et strcpy fournies par le fichier de déclarations C standard "string.h" (dans /usr/include/string.h). Elles ne se préoccupent pas du tout de savoir si la chaîne destination a suffisamment de place pour faire la manipulation voulue...

extern char *strcat(char *dst, const char *src);
extern char *strcpy(char *dst, const char *src);

  • Une fois vos fonctions écrites, compilez et exécutez. Vérifiez que les résultats des tests de vos fonctions sont conformes à ceux obtenus avec les fonctions strcat et strcpy de la bibliothèque des chaines du C.

Voici une solution


to top

I Attachment sort Action Size Date Who Comment
myStringsFunctions.c manage 1.4 K 17 Nov 2004 - 10:17 MichelBuffa  
chaines.c manage 2.2 K 17 Nov 2004 - 10:17 MichelBuffa  
majuscules.c manage 1.3 K 17 Nov 2004 - 10:17 MichelBuffa  
chaines-proc.h manage 0.7 K 17 Nov 2004 - 10:18 MichelBuffa  
chaines-proc.c manage 2.1 K 17 Nov 2004 - 10:18 MichelBuffa  
biblio.c manage 1.7 K 17 Nov 2004 - 10:20 MichelBuffa  

You are here: Linfo > CTPSurChaines > CTPSurChaines

to top

Copyright © 1999-2017 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding WIKIDeptinfo? Send feedback