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
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
A voir également:
- Exerciice de langage C
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Langage pascal - Télécharger - Édition & Programmation
- Delphi (langage) - Télécharger - Langages
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
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 ;)
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 ;)
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
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.
vous pouvez aussir revoir votre cours sur les allocations ^^.
char *Tab[10];
C'est parfaitement correct. Il s'agit d'un tableau de pointeurs.
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
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
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
merci fiddy c'est vraiment super ça marche impeccablement
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
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,
for(i=0;i<10;i++)
free(Tab[i]),Tab[i]=NULL;
Cdlt,
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
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
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 ;-)))
A la prochaine ;-)))