Aide pour un code
SKunt
Messages postés
155
Statut
Membre
-
kij_82 Messages postés 4260 Statut Contributeur -
kij_82 Messages postés 4260 Statut Contributeur -
Bonjour,
Voilà j'apprends le C et je suis des cours sur le site du zéro et je je suis à la fin de l'apprentissage des "bases" et je dois réaliser un pendu . cf le lien suivant pour plus de détails :https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/16828-tp-realisation-dun-pendu .
J'ai commencé à réaliser le code et je teste au fur et à mesure s'il tourne bien et j'ai un problème sur un printf:
Voici mon code (non achevé bien entendu ):
#include <stdio.h>
#include <stdlib.h>
#define TAILLE_MAX 15
#include <string.h>
int main()
{
FILE* fichier=NULL;
fichier=fopen("Dictionnaire.txt","r");//Ouverture du fichier texte.
char prop[1]="" , mot[15]="";
int essai=8 ;
char mot_choix[20]="", *mot_dico=NULL;
int nbreMots=0, i=0;
printf("Bienvenue dans le jeu du pendu\n");// Message de bienvenue.
if(fichier==NULL)
{
exit(0); //Si le pointeur du fichier n'est pas cré on arrête le jeu.
}else
printf("Dictionnaire present , le jeu est en preparation\n");
while (fgets(mot,TAILLE_MAX,fichier)!=NULL)
{
nbreMots+=1;
}
printf("%i mots actuellement dans le dictionnaire.\n",nbreMots); //On compte le nombre de mots dans le dictionnaire.
printf("Lecture des mots.\n");
mot_dico=malloc((nbreMots+1)*sizeof(mot));
while(fgets(mot,TAILLE_MAX,fichier)!=NULL)
{
strcpy((mot_dico + i),mot); //On copie chaque mot récupéré dans le tableau dynamique à l'indice i.
printf("%s",(mot_dico + i)); // Ce printf ne se fait pas !!!!
i+=1;
}
printf("Les mots sont prets et ranges.\n");
printf("Choix du mot, veuillez patienter !!!\n");
fclose(fichier);
return 0;
}
Mon problème se trouve au niveau du dernier commentaire : le printf ne s'effectie pas; je réalise cela pour tester si la copie de la chaine "mot[]" dans "mot_dico[]" est faite ou non mais en compilant aucun mot n'est affiché. Je tiens à dire qu'à la compilation je n'ai pas d'erreurs juste des warnings sur 3 petites variables que je n'utilise pas encore.
S.O.S je ne sais pas quoi faire
Voilà j'apprends le C et je suis des cours sur le site du zéro et je je suis à la fin de l'apprentissage des "bases" et je dois réaliser un pendu . cf le lien suivant pour plus de détails :https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/16828-tp-realisation-dun-pendu .
J'ai commencé à réaliser le code et je teste au fur et à mesure s'il tourne bien et j'ai un problème sur un printf:
Voici mon code (non achevé bien entendu ):
#include <stdio.h>
#include <stdlib.h>
#define TAILLE_MAX 15
#include <string.h>
int main()
{
FILE* fichier=NULL;
fichier=fopen("Dictionnaire.txt","r");//Ouverture du fichier texte.
char prop[1]="" , mot[15]="";
int essai=8 ;
char mot_choix[20]="", *mot_dico=NULL;
int nbreMots=0, i=0;
printf("Bienvenue dans le jeu du pendu\n");// Message de bienvenue.
if(fichier==NULL)
{
exit(0); //Si le pointeur du fichier n'est pas cré on arrête le jeu.
}else
printf("Dictionnaire present , le jeu est en preparation\n");
while (fgets(mot,TAILLE_MAX,fichier)!=NULL)
{
nbreMots+=1;
}
printf("%i mots actuellement dans le dictionnaire.\n",nbreMots); //On compte le nombre de mots dans le dictionnaire.
printf("Lecture des mots.\n");
mot_dico=malloc((nbreMots+1)*sizeof(mot));
while(fgets(mot,TAILLE_MAX,fichier)!=NULL)
{
strcpy((mot_dico + i),mot); //On copie chaque mot récupéré dans le tableau dynamique à l'indice i.
printf("%s",(mot_dico + i)); // Ce printf ne se fait pas !!!!
i+=1;
}
printf("Les mots sont prets et ranges.\n");
printf("Choix du mot, veuillez patienter !!!\n");
fclose(fichier);
return 0;
}
Mon problème se trouve au niveau du dernier commentaire : le printf ne s'effectie pas; je réalise cela pour tester si la copie de la chaine "mot[]" dans "mot_dico[]" est faite ou non mais en compilant aucun mot n'est affiché. Je tiens à dire qu'à la compilation je n'ai pas d'erreurs juste des warnings sur 3 petites variables que je n'utilise pas encore.
S.O.S je ne sais pas quoi faire
A voir également:
- Aide pour un code
- Code ascii - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
- Scanner qr code pc - Guide
13 réponses
Bonjour,
Ce n'est pas mot_dico[i] qu'il faut mettre dans le strcpy et ton printf ?
(ça fait un bail que je n'ai pas fais de C mais il me semble que c'était comme ça que ça se faisait)
Ce n'est pas mot_dico[i] qu'il faut mettre dans le strcpy et ton printf ?
(ça fait un bail que je n'ai pas fais de C mais il me semble que c'était comme ça que ça se faisait)
Le prototype de la fonction strcpy demande des pointeurs comme arguments mais je vais essayer ta technique !!
Oui justement, étant donné que tu créé un tableau de 'mot', si tu souhaite le remplir il faut que tu donne le "pointeur" sur chaque case (ou chaque mot) de ton tableau.
En tout cas, de sur, mettre 'mot_dico + i' n'est pas du tout la bonne façon de faire (au moins une chose dont je suis sûr ^^)
En tout cas, de sur, mettre 'mot_dico + i' n'est pas du tout la bonne façon de faire (au moins une chose dont je suis sûr ^^)
Bonjour,
Kij a bien pointé le bon problème
Tu fais un printf et un strcpy de ton tableau avec son pointeur décalé de "i".
Or oui, tu dois remplir chaque case de ton tableau, donc tu rempli tab[i], tab[i + 1] etc ...
Pareil pour le printf
En fait la, la fonction strcpy doit recevoir un char[] (char *) ou son adresse je sais plus
et toi tu lui envoi un tableau donc char[][] (char **) avec un décalage du pointeur.
Kij a bien pointé le bon problème
Tu fais un printf et un strcpy de ton tableau avec son pointeur décalé de "i".
Or oui, tu dois remplir chaque case de ton tableau, donc tu rempli tab[i], tab[i + 1] etc ...
Pareil pour le printf
En fait la, la fonction strcpy doit recevoir un char[] (char *) ou son adresse je sais plus
et toi tu lui envoi un tableau donc char[][] (char **) avec un décalage du pointeur.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Juste pour un rappel:
tableau[i] désigne la valeur dans la case i et tableau est le pointeur du tableau dans la mémoire ?
tableau[i] désigne la valeur dans la case i et tableau est le pointeur du tableau dans la mémoire ?
Oui, ce serait bien si tu modifiait ton code pour essayer histoire de ne pas y passer trop de message "inutiles" :)
Et au cas où l'on se trompe (ce qui est probable, nous n'avons pas la science infuse heureusement), il te faudra mettre pourquoi ça ne marche pas ? Ou exactement, une copie de ton nouveau code, ainsi que les messages d'erreur / exception que tu obtiens.
Et au cas où l'on se trompe (ce qui est probable, nous n'avons pas la science infuse heureusement), il te faudra mettre pourquoi ça ne marche pas ? Ou exactement, une copie de ton nouveau code, ainsi que les messages d'erreur / exception que tu obtiens.
Cette notion de créer une chaine dans chaque case d'un tableau me perturbe un peu !
En fait dans chaque case de mot_dico , il y a un tableau de la même taille que mot[] ?Pourtant mon idée me semblait correct car mon pointeur pointait vers la case de mon tableau et dans chaque case on stocke mot[].
En fait dans chaque case de mot_dico , il y a un tableau de la même taille que mot[] ?Pourtant mon idée me semblait correct car mon pointeur pointait vers la case de mon tableau et dans chaque case on stocke mot[].
Cette notion de créer une chaine dans chaque case d'un tableau me perturbe un peu !
En fait dans chaque case de mot_dico , il y a un tableau de la même taille que mot[] ?Pourtant mon idée me semblait correct car mon pointeur pointait vers la case de mon tableau et dans chaque case on stocke mot[].
En fait dans chaque case de mot_dico , il y a un tableau de la même taille que mot[] ?Pourtant mon idée me semblait correct car mon pointeur pointait vers la case de mon tableau et dans chaque case on stocke mot[].
Après modification, je n'obtiens rien de concluant avec 2 warnings lors de la compilation et pas de résultat concluant .Mon problème demeure non résolu !!!!!
Voici les messages obtenus à la compilation:
K:\pendu\pendu\main.c||In function `main':|
K:\pendu\pendu\main.c|32|warning: passing arg 1 of `strcpy' makes pointer from integer without a cast|
K:\pendu\pendu\main.c|33|warning: format argument is not a pointer (arg 2)|
K:\pendu\pendu\main.c|10|warning: unused variable `prop'|
K:\pendu\pendu\main.c|11|warning: unused variable `essai'|
K:\pendu\pendu\main.c|12|warning: unused variable `mot_choix'|
||=== Build finished: 0 errors, 5 warnings ===|
Les trois derniers sont normaux et les deux premiers proviennent du strcpy et du printf !!!!
Voici les messages obtenus à la compilation:
K:\pendu\pendu\main.c||In function `main':|
K:\pendu\pendu\main.c|32|warning: passing arg 1 of `strcpy' makes pointer from integer without a cast|
K:\pendu\pendu\main.c|33|warning: format argument is not a pointer (arg 2)|
K:\pendu\pendu\main.c|10|warning: unused variable `prop'|
K:\pendu\pendu\main.c|11|warning: unused variable `essai'|
K:\pendu\pendu\main.c|12|warning: unused variable `mot_choix'|
||=== Build finished: 0 errors, 5 warnings ===|
Les trois derniers sont normaux et les deux premiers proviennent du strcpy et du printf !!!!
Oui, ton pointeur pointe à chaque fois vers des 'mots', qui sont des tableaux de char.
Donc il faut bien parcourir ton pointeur. Et pour exploiter ce sur quoi pointe ton pointeur, si je ne m'abuse, ça s'écrit non pas 'mot_dico + i' mais 'mot_dico[i]'.
Ainsi pour remplir tu fera ceci :
Ou avec strcpy :
Idem pour la lecture.
Je ne vois pas ce qu'il y a de compliqué à corriger deux lignes de code et nous dire si ça fonctionne ou non.
Donc il faut bien parcourir ton pointeur. Et pour exploiter ce sur quoi pointe ton pointeur, si je ne m'abuse, ça s'écrit non pas 'mot_dico + i' mais 'mot_dico[i]'.
Ainsi pour remplir tu fera ceci :
for ( ... ){
mot_dico[i] = "tototototo";
}
Ou avec strcpy :
strcpy((mot_dico[i]),mot)
Idem pour la lecture.
Je ne vois pas ce qu'il y a de compliqué à corriger deux lignes de code et nous dire si ça fonctionne ou non.
Prends exemple sur cette discussion pour gérer avec pointeur sur pointeur ta liste de mot :
https://forums.commentcamarche.net/forum/affich-1509602-c-cahr-tab-allocation-dynamique#4
Ce sera je pense plus facile par la suite.
Qui plus est tu n'auras pas à te préoccuper de la taille de chaque mot.
Bon we.
https://forums.commentcamarche.net/forum/affich-1509602-c-cahr-tab-allocation-dynamique#4
Ce sera je pense plus facile par la suite.
Qui plus est tu n'auras pas à te préoccuper de la taille de chaque mot.
Bon we.