[C] TD5 - EX12

Voir le sujet précédent Voir le sujet suivant Aller en bas

resolu [C] TD5 - EX12

Message  Madrid le Dim 24 Oct 2010, 12:01

salut les amis,

tout d'abord voici l'énoncé de l'exercice:

Un texte a été découpé en plusieurs morceaux. Attention qu'il peut n'y avoir qu'un seul
morceau. Chaque morceau a ensuite été inversé (par exemple: Bonjour -> ruojnoB). La
fonction getTexte01, retourne l'adresse d'une chaîne qui est un morceau du texte. Lors du 1ier
appel, elle retourne le 1ier morceau, lors du 2ième appel le 2ième, et ainsi de suite, jusqu'à
retourner NULL pour signaler qu'il n'y a plus rien à donner. La chaîne à l'adresse retournée est
valable jusque l'appel suivant à la fonction.
Le but de l'exercice est d'afficher le texte d'origine sans utiliser de tableaux et en
effectuant le minimum d'allocation mémoire.
Prototype : const char * getTexte01 (void) ;

dans mon code je ne gère pas encore l'inversion du texte je me contente d'abord d'extraire tous les morceaux du texte en les copiant dans une zone mémoire réservée mais je n'obtiens pas tous les morceaux (le texte complet ) voici mon code

Code:
int main(void) {
   char * chaine;
   const char * pChaine;
   pChaine = getTexte01();
   if (pChaine != NULL) {
      chaine = malloc((strlen(pChaine) + 1) * sizeof(char));  /*  +1 pour le '/0'  */
      chaine = strcpy(chaine, pChaine);
      while ((pChaine = getTexte01()) != NULL) {
         realloc(chaine, (strlen(chaine) + strlen(pChaine) + 1)
               * sizeof(char));
         chaine = strcat(chaine, pChaine);
      }
   }
   printf("%s", chaine);
   free(chaine);
   return EXIT_SUCCESS;
}

merci pour votre aide les amis si vous avez 5 minutes à me consacrer.


Dernière édition par Madrid le Dim 14 Nov 2010, 12:54, édité 1 fois

Madrid

Nombre de messages : 187
Prénom : Noor
Statut : étudiant 2RET
Localisation : Woluwé-Saint-Lambert
Date d'inscription : 28/12/2006

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX12

Message  nvs le Dim 24 Oct 2010, 12:22

il me semble que tu obtiens bien tous les morceaux. par contre, ton code fait parfois boum à l'exécution ! un problème dans ton utilisation de realloc... et tant qu'à faire, quel est l'intérêt d'utiliser la valeur de retour de strcat ? et enfin, en initialisant chaine à NULL, tu pourrais te passer du malloc et de la complexité de ton code qui en découle car cela te permettrait d'utiliser uniformément realloc (qui se comporte comme malloc si son premier argument est NULL).








Rolling Eyes

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX12

Message  Madrid le Dim 24 Oct 2010, 14:57

nvs a écrit:il me semble que tu obtiens bien tous les morceaux. par contre, ton code fait parfois boum à l'exécution ! un problème dans ton utilisation de realloc... et tant qu'à faire, quel est l'intérêt d'utiliser la valeur de retour de strcat ? et enfin, en initialisant chaine à NULL, tu pourrais te passer du malloc et de la complexité de ton code qui en découle car cela te permettrait d'utiliser uniformément realloc (qui se comporte comme malloc si son premier argument est NULL).
Rolling Eyes

après les remarques voici les modification réalisées surmon code
Code:
int main(void) {
   char * chaine;
   const char * pChaine;
   char * pFin;
   pChaine = getTexte01();
   if (pChaine != NULL) {
      chaine = malloc((strlen(pChaine) + 1) * sizeof(char)); /* +1 pour le '/0'*/
      chaine = strcpy(chaine, pChaine);
      while ((pChaine = getTexte01()) != NULL) {
         chaine = realloc(chaine, (strlen(chaine) + strlen(pChaine) + 1)
               * sizeof(char));
         strcat(chaine, pChaine);
      }
   }

   for (pFin = chaine + strlen(chaine) -1 ; pFin >= chaine; pFin--)
      printf("%c", *pFin);

   free(chaine);
   return EXIT_SUCCESS;
}

un des résultats qui me parait pas correct Neutral


(Jules Renard)
ndre les autres.
les d'effort pour compreNous sommes si peu capab

Madrid

Nombre de messages : 187
Prénom : Noor
Statut : étudiant 2RET
Localisation : Woluwé-Saint-Lambert
Date d'inscription : 28/12/2006

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX12

Message  smb le Dim 24 Oct 2010, 15:04

Il ne te reste plus qu'à afficher le résultat correctement !

Wink

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX12

Message  Madrid le Dim 24 Oct 2010, 15:15

smb a écrit:Il ne te reste plus qu'à afficher le résultat correctement !

Wink

Code:
for (pFin = chaine + strlen(chaine) - 1; pFin >= chaine; pFin--)
      printf("%c", *pFin);

un résultat:
(Nietzsche)
de se dissimuler.
un moyen être soi peutde beaucoup Parler

Madrid

Nombre de messages : 187
Prénom : Noor
Statut : étudiant 2RET
Localisation : Woluwé-Saint-Lambert
Date d'inscription : 28/12/2006

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX12

Message  smb le Dim 24 Oct 2010, 16:32

C'est pas dans le bon ordre !

(Les textes obtenus aléatoirement pour chaque fonction sont visibles dans le répertoire TD_C5 sur poESI)


bounce

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX12

Message  Madrid le Dim 24 Oct 2010, 19:01

Merci pour votre aide.

Madrid

Nombre de messages : 187
Prénom : Noor
Statut : étudiant 2RET
Localisation : Woluwé-Saint-Lambert
Date d'inscription : 28/12/2006

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX12

Message  L@rgo_XIII le Mar 02 Nov 2010, 16:15

Petite remarque que je me suis faite en voyant ton code et qui m'a permis d'optimiser le mien.

J'ai remarqué que tu affichais ton résultat caractère par caractère (%c) au lieu de directement afficher la chaine (%s).

A partir du moment ou tu fais cela, quel est l'intérêt de réserver un emplacement mémoire pour y écrire le bout de texte réordonné puisque c'est uniquement pour le parcourir de la même façon quelques instant plus tard afin de l'afficher.

Pourquoi ne pas afficher directement le résultat sans le mémoriser ?

Après tout l'énoncé de l'exercice 12 est

Le but de l'exercice est d'afficher le texte d'origine sans utiliser de tableau et en effectuant le minimum d'allocation mémoire

Pour ma part, après optimisation, je n'effectue AUCUNE allocation mémoire. Je n'utilise que l'espace mémoire occupé par les chaines données par getTexte01() que je libère une fois le résultat affiché. Ainsi mon code est à la fois très condensé et peu gourmand en mémoire.

Lionel

L@rgo_XIII

Nombre de messages : 80
Age : 30
Prénom : Lionel
Statut : Etudiant en 3e année Réseau & Télécommunicatio
Localisation : Uccle
Date d'inscription : 20/09/2010

http://largoxiii.wordpress.com

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX12

Message  smb le Mar 02 Nov 2010, 16:28

L@rgo_XIII a écrit:

(...)

Pour ma part, après optimisation, je n'effectue AUCUNE allocation mémoire. Je n'utilise que l'espace mémoire occupé par les chaines données par getTexte01() que je libère une fois le résultat affiché. Ainsi mon code est à la fois très condensé et peu gourmand en mémoire.

Lionel

... sauf que tu n'as pas à t'occuper de la libération de la zone mémoire retournée par getTexte01 car cette fonction retourne un const char * !

Wink

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX12

Message  Madrid le Mer 03 Nov 2010, 12:55

L@rgo_XIII a écrit:Petite remarque que je me suis faite en voyant ton code et qui m'a permis d'optimiser le mien.

J'ai remarqué que tu affichais ton résultat caractère par caractère (%c) au lieu de directement afficher la chaine (%s).

A partir du moment ou tu fais cela, quel est l'intérêt de réserver un emplacement mémoire pour y écrire le bout de texte réordonné puisque c'est uniquement pour le parcourir de la même façon quelques instant plus tard afin de l'afficher.

Pourquoi ne pas afficher directement le résultat sans le mémoriser ?

Après tout l'énoncé de l'exercice 12 est

Le but de l'exercice est d'afficher le texte d'origine sans utiliser de tableau et en effectuant le minimum d'allocation mémoire

Pour ma part, après optimisation, je n'effectue AUCUNE allocation mémoire. Je n'utilise que l'espace mémoire occupé par les chaines données par getTexte01() que je libère une fois le résultat affiché. Ainsi mon code est à la fois très condensé et peu gourmand en mémoire.

Lionel
oui c'est bien juste se que tu dis et je l'est fais avant, mais je le fais avec des allocations mémoire pour pouvoir maitriser la notion d'allocation et libération de mémoire en utilisant les différents fonctions de la librairie standard (malloc,realloc...)
bien à toi Noor

Madrid

Nombre de messages : 187
Prénom : Noor
Statut : étudiant 2RET
Localisation : Woluwé-Saint-Lambert
Date d'inscription : 28/12/2006

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX12

Message  Contenu sponsorisé Aujourd'hui à 05:24


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum