Cmt lire un mot ds un fichier et l envoyer vers un char[]?
Fermé
astengo
Messages postés
8
Date d'inscription
dimanche 24 août 2014
Statut
Membre
Dernière intervention
29 avril 2015
-
7 sept. 2014 à 19:56
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 8 sept. 2014 à 11:40
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 8 sept. 2014 à 11:40
A voir également:
- Cmt lire un mot ds un fichier et l envoyer vers un char[]?
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier rar - Guide
- Ouvrir un fichier .bin - Guide
- Comment ouvrir un fichier docx ? - Guide
2 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
7 sept. 2014 à 20:18
7 sept. 2014 à 20:18
Bonjour,
motSecret = NULL;
motSecret = malloc(nbLettres * sizeof(int));
Pourquoi mettre NULL dans motSecret et remettre juste derrière malloc() ? La première est superflue.
Sinon, tu fais une allocation dans motSecret qui est une copie de motSecret du main(). Dis autrement, à la fin de la fonction, motSecret vaut toujours NULL (puisque tu as fait char *motSecret=0; D'ailleurs, ça serait mieux de faire : =NULL que = 0.
Il faut donc passer par un double pointeur.
Corrige et dis-nous si le problème persiste.
Cdlt,
motSecret = NULL;
motSecret = malloc(nbLettres * sizeof(int));
Pourquoi mettre NULL dans motSecret et remettre juste derrière malloc() ? La première est superflue.
Sinon, tu fais une allocation dans motSecret qui est une copie de motSecret du main(). Dis autrement, à la fin de la fonction, motSecret vaut toujours NULL (puisque tu as fait char *motSecret=0; D'ailleurs, ça serait mieux de faire : =NULL que = 0.
Il faut donc passer par un double pointeur.
Corrige et dis-nous si le problème persiste.
Cdlt,
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
Modifié par [Dal] le 8/09/2014 à 11:46
Modifié par [Dal] le 8/09/2014 à 11:46
Salut astengo,
Pour la malloc, fiddy a raison. Alternativement, puisque tu déclares
Sinon, il y a de nombreux autres problèmes.
1.
Tu n'as pas mis l'implémentation de la fonction presence, cependant son prototype est :
dans main, tu l'appelles ainsi :
alors que maLettre est un char (et pas un pointeur sur char)
s'il s'agit bien d'une lettre, ton prototype ne devrait-il pas être :
Dans ton main.c, tu utilises time(), il te faudrait un
2.
Dans NbMots, ton compteur devrait être initialisé à 0, pas à un.
Dans choisitMot, tu fais
Par conséquent, ton bloc :
n'est pas adapté, tu devrais faire un
Le suivant :
devrait en revanche être un do / while. Sinon, lorsque tu arrives au while, caractereActuel vaut déjà '\n' car c'est là que c'est arrêtée ta boucle précédente, et aucun caractère n'est consommé par la nouvelle boucle (nbLettres restant alors à 0).
Enfin, à la fin de la boucle for tu copies aussi le '\n' qui vient du fichier, tu devrais l'écraser et le remplacer par '\0' pour terminer la chaîne à cet endroit.
Donc, ajouter un
Tu devrais faire un
Dal
Pour la malloc, fiddy a raison. Alternativement, puisque tu déclares
char motCache[27] = {0};ce qui fixe une limite à la longueur du mot à un maximum de 26 lettres, tu pourrais faire
char motSecret[27] = {0};et t'éviter les doubles pointeurs et le malloc (en vérifiant que les mots n'excèdent pas cette limite).
Sinon, il y a de nombreux autres problèmes.
1.
Tu n'as pas mis l'implémentation de la fonction presence, cependant son prototype est :
int presence(const char* mot,const char* lettre, char*motMasque);
dans main, tu l'appelles ainsi :
trouveLettre = presence(motSecret, maLettre, motCache);
alors que maLettre est un char (et pas un pointeur sur char)
s'il s'agit bien d'une lettre, ton prototype ne devrait-il pas être :
int presence(const char* mot, const char lettre, char*motMasque);
Dans ton main.c, tu utilises time(), il te faudrait un
#include <time.h>
2.
Dans NbMots, ton compteur devrait être initialisé à 0, pas à un.
Dans choisitMot, tu fais
ligne = (rand() % nbMots) + 1 ;, et donc, s'il y a 10 mots, ligne va valoir de 1 à 10.
Par conséquent, ton bloc :
do // je vais a la bonne ligne pour lire le mot choisi par le pgm { caractereActuel = fgetc(fichier); if (caractereActuel == '\n') { chercheEntree++; } }while(chercheEntree < ligne);
n'est pas adapté, tu devrais faire un
while(chercheEntree < ligne), autrement, en cherchant la ligne 1, tu tomberas sur la ligne 2.
Le suivant :
while (caractereActuel != '\n')// je compte le nombre de lettres dans le mot { caractereActuel = fgetc(fichier); nbLettres++; }
devrait en revanche être un do / while. Sinon, lorsque tu arrives au while, caractereActuel vaut déjà '\n' car c'est là que c'est arrêtée ta boucle précédente, et aucun caractère n'est consommé par la nouvelle boucle (nbLettres restant alors à 0).
Enfin, à la fin de la boucle for tu copies aussi le '\n' qui vient du fichier, tu devrais l'écraser et le remplacer par '\0' pour terminer la chaîne à cet endroit.
Donc, ajouter un
motSecret[nbLettres - 1] = '\0';après ta boucle.
Tu devrais faire un
fclose(fichier);à la fin de l'implémentation de
choisitMot.
Dal