Exerciice de langage C

aziz1015 -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
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

aziz1015
 
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
 
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   Statut Contributeur Dernière intervention   1 846
 
@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   Statut Contributeur Dernière intervention   1 846
 
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
aziz1015
 
merci fiddy c'est vraiment super ça marche impeccablement
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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
aziz1015
 
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   Statut Contributeur Dernière intervention   1 846
 
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