Exerciice de langage C

Fermé
aziz1015 - 6 janv. 2012 à 21:18
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 7 janv. 2012 à 17:50
Bonjour, voici le problème auquel je suis confronté, j'ai besoin de votre aide. Merci d'avance

Ecrire un programme en c qui lit 10 phrases d'une longueur de 200 caractères au clavier et qui les memorise dans un tableau de pointeurs sur char en réservant dynamiquement l'emplacement en mémoire pour les chaines.Ensuite,lordre des phrases est inversé en modifiant les pointeurs et le tableau résultant est affiché


#include <stdio.h>
#include <stdlib.h>

int main()
{
int i, j;
char *P;
char CH[200];
char *Tab[10];
puts("Introduire dix phrases au clavier :");
for(i=0; i<10; i++)
{
printf("Donner la phrase %d du tableau (max.200):", i);
gets(CH);
Tab = (char*)malloc(500*sizeof(CH));
}
printf("Affichage du tableau:\n");
for(i=0;i<10;i++)
{
puts(Tab[i]);
}
for (i=0; j=9; i<j; i+++, j--)
{
P=Tab[i];
Tab[i]=Tab[j];
Tab[j]=P;
}
printf("Donner le tableau resultant:\n");
for(i=0; i<10; i++)
{
puts (Tab[i]);
}
system("pause");
return 0;
}


A voir également:

5 réponses

mon problème je crois que c'est au niveau de l'allocation parce que c'est surtout là que ça bugue!!! aidez moi svp
0
jenaimarre2fr
7 janv. 2012 à 13:49
azzul a aziz ;)

l'erreur de ton programme est très simple, il suffit juste de revoir juste un petit peu tes cours d'allocation dynamique de mémoire....
quand tu suhaites faire une allocation dynamique, tu dois créer un pointeur du meme type que les données sur lesquelles il pointera, en bref, toi t'as déclaré Tab comme un mélange de pointeur et de tableau (c'est la première fois que je voix cette écriture, d'ailleurs je ne sia smm pas ça existe ou pas, en tous les cas pas dans les alloc mem), donc pour corriger cette erreur, il suffit de déclarer on Tab comme un simple pointeur

char* Tap; //pointeur sur caractères....

il ne faut surtout pas oublier de mettre le caractère de fin de chaine '\0' une fois ton buffer rempli (Tab)
par contre les primitives puts(), system() je les ai jamais utilisé.....don je ne peux pas t'en dire plus
bon courage a gma ;)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
7 janv. 2012 à 14:03
@jenaimarre2fr,
vous pouvez aussir revoir votre cours sur les allocations ^^.
char *Tab[10];
C'est parfaitement correct. Il s'agit d'un tableau de pointeurs.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
Modifié par fiddy le 7/01/2012 à 14:15
Bonjour,

gets(CH);
Il ne faut pas utiliser cette fonction. Il vaut mieux utiliser fgets qui permet de limiter la saisie : fgets(CH, sizeof CH, stdin);

Tab = (char*)malloc(500*sizeof(CH));
Cela revient à faire : Tab=malloc(1000); puisque sizeof(CH) = 200.
En revanche, il serait intéressant de faire : malloc(strlen(CH) + 1);
Cela réservera la bonne longueur, ni plus, ni moins (contrairement à sizeof).
Ensuite, il faut stocker le malloc dans Tab[i] et non dans Tab. Puisqu'il y a incompatibilité dans les types. Et enfin, le cast est implicite, donc pas besoin de le mettre.
Ce qui donne : Tab[i]=malloc(strlen(CH) + 1);
Il ne faut pas non plus oublier de stocker CH dans Tab[i], pour cela tu peux utiliser strcpy (ou strncpy pour la version sécurisée) : strcpy(Tab[i],CH);

for (i=0; j=9; i<j; i+++, j--)
Plutôt i++ non ?

Le reste est très bien. Après, dans le style de codage :
int main (void), c'est mieux.
Faire des fonctions, cela rendra le code plus lisible.
Restreindre la portée des variables.
Contrôler le retour des malloc, et fgets.
Rendre le code portable en évitant system("pause");
Commenter le code.

Cdlt,

Google is your friend
0
merci fiddy c'est vraiment super ça marche impeccablement
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
7 janv. 2012 à 14:30
Et pendant que j'y pense, n'oublie pas les free() pour libérer les ressources allouées :
for(i=0;i<10;i++)
free(Tab[i]),Tab[i]=NULL;

Cdlt,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sisi je l'ai déjà fait merci, pourrais je stp avoir ton email au cas où j'aurais encore besoin d'aide
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
7 janv. 2012 à 17:50
Tu ouvres un post sur le forum avec au moins le mot clé "C" comme tu l'as fait, et je répondrai (si j'ai le temps).
A la prochaine ;-)))
0