Partage
  • Partager sur Facebook
  • Partager sur Twitter

bug ?

Sujet résolu
    8 juillet 2019 à 3:15:11

    Bonsoir, je me dirige sur le forum a la recherche d'un peu d'aide car il y a quelque chose qui m'échappe, je vous explique..

    J'ai (re)commencé mon code pour faire le jeu du pendu, et j'ai créer une fonction qui compte le nombre de caractère dans le mot à cacher, puis il le créer avec des '*' en fontion, mais voila, quand un mot contient 8 caractères, il m'affiche un [?] à la fin, par contre, 5,6,7,9 ect m'affiche correctement le mot caché....

    Je pense que ca coince sur la fontions Count_And_Hide mais je ne vois vraiment pas pourquoi..

    Voici mon code, en espérant ne pas trop vous saoulez..

    main.c :

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    
    #define TABLEAU_MAX 1000
    
    int main ( int argc, char *argv[] )
    {
        const int MIN = 1;
        int nombre_Coup_Restant = 10;
        int quantite_Mot = 0;
        int mot_Aleatoire_Numero = 0;
        unsigned char mot_Mystere[TABLEAU_MAX];
        unsigned char mot_Mystere_Cache[TABLEAU_MAX];
        srand(time(NULL));
    
        Creation_Liste_Mot();
    
        FILE *pendu = fopen("MOT_PENDU.txt", "r");
    
        quantite_Mot = Combien_Mot(pendu); // fonction qui renvois la valeur du nombre de mot se trouveant dans le .txt
    
        mot_Aleatoire_Numero = (rand() % (quantite_Mot - MIN + 1)) + MIN; // choisis un mot aléatoirement via le nombre de ligne dans le .txt
    
        Prend_Mot_Ligne_(mot_Aleatoire_Numero, pendu, mot_Mystere); // récupère le mot a la ligne spécifié via le nombre aléatoire
    
        fclose(pendu);
    
        Count_And_Hide(mot_Mystere, mot_Mystere_Cache); // compte les lettres et cache le mot en fonctions du nombre de lettre en mettant des '*'
    
        /* ------------------------------------------------- */
    
        printf("[%d] // [%s] // [%s]", mot_Aleatoire_Numero, mot_Mystere, mot_Mystere_Cache); // TEST
    }

    word.c : // contient mes fonctions

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define TABLEAU_MAX 1000
    
    void Creation_Liste_Mot(void) // création des mots dans le .txt
    {
        FILE *pendu = fopen("MOT_PENDU.txt", "w");
    
        fputs("COUSCOUS\n", pendu);
        fputs("SUCETTE\n", pendu);
        fputs("MARRON\n", pendu);
    
        rewind(pendu); // reset pour la fonction suivante (Combien_Mot)
    
        fclose(pendu);
    }
    
    int Combien_Mot ( FILE *fichier )
    {
        int i = 0;
        unsigned char j[1000];
    
        while (fgets(j, 1000, fichier) != NULL)
        {
            i++;
        }
    
        rewind(fichier); // reset pour la fonction suivante (Prend_Mot_Ligne_)
    
        return i;
    }
    
    void Prend_Mot_Ligne_ (int rand, FILE* fichier, char *mot)
    {
        int i = 0;
    
        for ( i = 0 ; i < rand ; i++)
            fgets(mot, TABLEAU_MAX, fichier);
    
        rewind(fichier);
    }
    
    void Count_And_Hide ( char mot_A_Cacher[], char *mot_Cache )
    {
        int i = 0;
        int longueur = 0;
    
        longueur = strlen(mot_A_Cacher);
    
        for ( i = 0; i < longueur - 1; i++)
            mot_Cache[i] = '*';
    }
    
    

    je ne vous mes pas mon word.h car elle ne contient que les prototypes. 

    CORDIALEMENT !


    • Partager sur Facebook
    • Partager sur Twitter
      8 juillet 2019 à 10:20:05

      Peut-être que c'est parce que tu n'ajoutes pas le caractère nul de fin de chaîne lorsque tu construis mot_Cache ?
      • Partager sur Facebook
      • Partager sur Twitter
        8 juillet 2019 à 10:21:42

        Pourquoi  i < longueur - 1 à la ligne 52 de word.c ?
        • Partager sur Facebook
        • Partager sur Twitter

        Le crayon la gomme et le papier sont les meilleurs outils du programmeur !

          8 juillet 2019 à 10:37:59

          Comment fait main.c pour connaitre le prototype des fonction de word.c que tu utilises ?

          Il faut lire et corriger les warnings !

          joel76 a écrit:

          Pourquoi  i < longueur - 1 à la ligne 52 de word.c ?

          C'est pour enlever le '\n' de fin de ligne. (fgets le met dans la chaîne de caractères).

          -
          Edité par rouloude 8 juillet 2019 à 10:47:27

          • Partager sur Facebook
          • Partager sur Twitter
            8 juillet 2019 à 12:44:02

            rouloude a écrit:

            Comment fait main.c pour connaitre le prototype des fonction de word.c que tu utilises ?

            Il faut lire et corriger les warnings !

            joel76 a écrit:

            Pourquoi  i < longueur - 1 à la ligne 52 de word.c ?

            C'est pour enlever le '\n' de fin de ligne. (fgets le met dans la chaîne de caractères).

            -
            Edité par rouloude il y a environ 1 heure


            C'est vrai ca ! Je ne sais pas comment mon code a fait pour marcher jusqu'à la..... J'ai rajouté le #include "word.h" et du coup plus rien ne fontionne... yes :'(

            robun a écrit:

            Peut-être que c'est parce que tu n'ajoutes pas le caractère nul de fin de chaîne lorsque tu construis mot_Cache ?


            Les 2 autres mots fonctionne très bien, c'est juste le fait qu'un mot fasse 8 caracteres ou non qui bloque, mais depuis que j'ai ajouté le include, plus rien ne marche..

            -
            Edité par MelvinSawada 8 juillet 2019 à 12:48:00

            • Partager sur Facebook
            • Partager sur Twitter
              8 juillet 2019 à 13:11:08

              Ça marchait car le langage C prend des prototype par défaut s'il n'en trouve pas.

              Les chaînes de caractères devraient être stockées dans des tableau de char, pas unsigned char,  

              rouloude a écrit:

              Il faut lire et corriger les warnings !

               Poste ton fichier word.h



              • Partager sur Facebook
              • Partager sur Twitter
                8 juillet 2019 à 13:53:30

                MelvinSawada a écrit:

                robun a écrit:

                Peut-être que c'est parce que tu n'ajoutes pas le caractère nul de fin de chaîne lorsque tu construis mot_Cache ?


                Les 2 autres mots fonctionne très bien, c'est juste le fait qu'un mot fasse 8 caracteres ou non qui bloque, mais depuis que j'ai ajouté le include, plus rien ne marche..

                OK admettons que ça marchait. Mais es-tu d'accord que c'est une erreur d'oublier le caractère nul de fin de chaîne ? Si tu es d'accord, il faut corriger cette erreur, peu importe que le programme marche ou pas (le fait qu'un programme marche ne prouve pas qu'il n'y a pas d'erreurs dedans !). De toute façon ton programme ne marche pas. Et il y a des chances que c'est cet oubli qui cause le problème.

                (Tu as un problème dont tu ne vois pas la cause, on te propose une piste basée sur une réelle erreur de programmation, à mon avis il faut essayer...)

                • Partager sur Facebook
                • Partager sur Twitter
                  8 juillet 2019 à 15:24:48

                  robun a écrit:

                  MelvinSawada a écrit:

                  robun a écrit:

                  Peut-être que c'est parce que tu n'ajoutes pas le caractère nul de fin de chaîne lorsque tu construis mot_Cache ?


                  Les 2 autres mots fonctionne très bien, c'est juste le fait qu'un mot fasse 8 caracteres ou non qui bloque, mais depuis que j'ai ajouté le include, plus rien ne marche..

                  OK admettons que ça marchait. Mais es-tu d'accord que c'est une erreur d'oublier le caractère nul de fin de chaîne ? Si tu es d'accord, il faut corriger cette erreur, peu importe que le programme marche ou pas (le fait qu'un programme marche ne prouve pas qu'il n'y a pas d'erreurs dedans !). De toute façon ton programme ne marche pas. Et il y a des chances que c'est cet oubli qui cause le problème.

                  (Tu as un problème dont tu ne vois pas la cause, on te propose une piste basée sur une réelle erreur de programmation, à mon avis il faut essayer...)


                  Non non, je ne passe pas outre le fait que j'ai oublié le caractère '\0' a la fin, mais je cherche à comprendre pourquoi mon programme marchais sans prototype, et qu'il ne marche plus avec.. Je vais essayé de refaire ma fonction en mettant le caractere en question !

                  Merci de vos réponses rapide !

                  PS : j'ai modifié mon code et rajouté un '\0' a la fin, mais il ne marche que quand j'enleve le #include "word.h" ....

                  -
                  Edité par MelvinSawada 8 juillet 2019 à 15:33:07

                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 juillet 2019 à 15:37:12

                    d'où le commentaire :

                    rouloude a écrit:

                    Il faut lire et corriger les warnings !

                    Poste ton fichier word.h



                    • Partager sur Facebook
                    • Partager sur Twitter

                    En recherche d'emploi.

                      8 juillet 2019 à 16:08:14

                      Dalfab a écrit:

                      d'où le commentaire :

                      rouloude a écrit:

                      Il faut lire et corriger les warnings !

                      Poste ton fichier word.h



                      Désolé j'avais pas vus... ( la chaleur me monte a la tête je pense )

                      #ifndef __WORD__H__
                      #define __WORD__H__
                      
                      void Creation_Liste_Mot(void);
                      int Combien_Mot ( FILE *fichier );
                      void Prend_Mot_Ligne_ (int rand, FILE* fichier, char *mot);
                      void Count_And_Hide ( char mot_A_Cacher, char* mot_Cache);
                      
                      #endif // __WORD__H__

                      PS : Purée mais qu'est ce que je ferais sans vous sans déconner.... J'ai trouvé ! dans le prototype : void Count_And_Hide ( char mot_A_Cacher, char* mot_Cache); j'ai oublié de mettre les crochets pour indiquer que c'est un tableau qu'il recoit, et non pas une lettre....

                      Excusez mon incompétence absolue svp :((

                      en tout cas je vous remercie mille fois d'avoir pris votre temps pour m'aider !!!

                      -
                      Edité par MelvinSawada 8 juillet 2019 à 16:13:28

                      • Partager sur Facebook
                      • Partager sur Twitter

                      bug ?

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown