Probleme code

Bonjour,
voila je veus réaliser un pendu voila le code que j'ai fais

main.c :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "prototype.h"
int main()
{
    char motSecret[] = "ROUGE", lettreBonne[6] = ""; // Tableau pour stocker le mot
    char lettre = 0; // variable de type char qui sert a reconvertir le nbre stocker en lettre
    int nbreCoups = 10, i = 0; //le nombre de coups qui reste a l'utilisateur et une variable pour une boucle

    printf("Bienvenue Dans le pendu\n\n\n"); // on affiche la bienvenue

    /*
     On fait une boucle tant que nombre de coups
    est superieur a 0 alors elle affiche le contenue ...
    */
    while(nbreCoups > 0 || lettreBonne != motSecret)
    {
        printf("il vous reste %d coups\n\n", nbreCoups);
        printf("Quel est le mot secret?");

           for(i = 0; i < strlen(motSecret); i++) // une boucle pour afficher les *****
           {
               if(motSecret[i] == lettre) // si lettre elle existe alors affiche la
               {
                   lettreBonne[i] = lettre;// On stocke la lettre dans un tableau si c'est la bonne
                   printf("%s", lettreBonne);
               }
               else // sinon affiche une étoile
               {
                   printf("*");
               }
           }
            printf("\nProposer une lettre \n");
            lettre = lireCaractere(); // On stocke le caractere returner dans lettre

           if(strchr(motSecret, lettre) == NULL)
           {
               nbreCoups--;
           }
           if(motSecret == lettreBonne)
           {
               printf("BRAVO !!!! vous venez de truover le mot secret\n");
           }
    }
    return 0;
}


fonction.c:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include "prototype.h"


char lireCaractere()
{
    char caractere = 0;

    caractere = getchar(); //On lit caractere 1 a 1 de la chaine tapez au clavier grace a la fonction getchar()
    caractere = toupper(caractere); //On met la lettre on majuscule si elle ne l'est pas

    //On lit les caracteres 1 a 1 jusqua tomber sur l' \n (pourles éffacer)
    while(getchar() != '\n');

    return caractere;
}



et voici le fichier prototype.h

#ifndef PROTOTYPE_H_INCLUDED
#define PROTOTYPE_H_INCLUDED


#endif // PROTOTYPE_H_INCLUDED

char lireCaractere();
Configuration: Linux
Firefox 3.0.8

8 réponses

  1. ah oui est j'aioublier d'afficher le resultat du code bon voila ce que sa donne

    [user@guillemot Debug]$ ./pendu 
    Bienvenue Dans le pendu
    
    
    il vous reste 10 coups
    
    Quel est le mot secret?*****
    Proposer une lettre 
    R
    il vous reste 10 coups
    
    Quel est le mot secret?R****
    Proposer une lettre 
    G
    il vous reste 10 coups
    
    Quel est le mot secret?***R*
    Proposer une lettre 
    
    [user@guillemot Debug]$ 
    

    je ne comprend pas pourquoi il remplace G par R
    1. Contributeur
      j'ai regardé vite fait, voici ce qui me choque (à première vu):
      lettreBonne[6] = "" (dans la déclaration) ---> tu ferais mieux de déclarer un pointeur, et d'uy affecter ton tableau de char en dynamique (puisque plustard tu vas avoir des mots différents de 6 lettres, et le remplir par des * et finir par le \0 de fin de chaine

      de plus, je vais regarder pourquoi tu as toujours il vous reste 10 coups
      1. 2 grosses erreurs:
        - lettreBonnedéjà dit, erreur dans la déclaration, mais non seulement il faut lui donner de l'espace mémoire, mais en plus il faut initialiser cet espace,
        - lettreBonne != motSecret est possible mais ne réalise pas ce que tu veux. Cette ligne compare les deux pointeurs, c'est-à-dire leurs adresses mais pas leurs contenus ! En 'C' pour comparer deux chaînes, il est nécessaire d'utilser la fonction 'strcmp'.
        D'autre part, if(strchr(motSecret, lettre) == NULL) est inutile car tu as déjà recherché si la lettre saisie était dans la mot à rechercher; en outre je ne pense pas que la diminution du nombre de coups soit lié au fait que la lettre est bonne, mais simplement qu'une lettre a été saisie; en conséquense on diminue systématiquement le nombre de coups.
        Une solution plus simple est d'initialiser la chaîne 'lettreBonne' avec des étoiles et de substituer, au fur et à mesure des lettres trouvées, les étoiles par la bonne lettre.
        Bon jeu.
        1. bon alors tout d'abord voila le news code avec les correction que vous m'avez conseillez:
          #include <stdio.h>
          #include <stdlib.h>
          #include <string.h>
          #include "prototype.h"
          int main()
          {
              char motSecret[] = "ROUGE", *lettreBonne = NULL; // Tableau pour stocker le mot
              char lettre = 0; // variable de type char qui sert a reconvertir le nbre stocker en lettre
              int nbreCoups = 10, i = 0, nbreLettre = 0; //le nombre de coups qui reste a l'utilisateur et une variable pour une boucle
          
              lettreBonne = malloc(nbreLettre * sizeof(char));
              printf("Bienvenue Dans le pendu\n\n\n"); // on affiche la bienvenue
          
              /*
               On fait une boucle tant que nombre de coups
              est superieur a 0 alors elle affiche le contenue ...
              */
              while(nbreCoups > 0 || strcmp(lettreBonne, motSecret) != 0)
              {
                  printf("il vous reste %d coups\n\n", nbreCoups);
                  printf("Quel est le mot secret?");
          
                     for(i = 0; i < strlen(motSecret); i++) // une boucle pour afficher les *****
                     {
                         if(motSecret[i] == lettre) // si lettre elle existe alors affiche la
                         {
                             lettreBonne[i] = lettre;// On stocke la lettre dans un tableau si c'est la bonne
                             printf("%s", lettreBonne);
                         }
                         else // sinon affiche une étoile
                         {
                             printf("*");
                         }
                     }
                      printf("\nProposer une lettre \n");
                      lettre = lireCaractere(); // On stocke le caractere returner dans lettre
          
                     if(strchr(motSecret, lettre) == NULL)
                     {
                         nbreCoups--;
                     }
                     if(strcmp(motSecret, lettreBonne) == 0)
                     {
                         printf("BRAVO !!!! vous venez de truover le mot secret\n");
                     }
              }
              free(lettreBonne);
              return 0;
          }
          


          if(strchr(motSecret, lettre) == NULL) est inutile car tu as déjà recherché si la lettre saisie était dans la mot à rechercher; en outre je ne pense pas que la diminution du nombre de coups soit lié au fait que la lettre est bonne, mais simplement qu'une lettre a été saisie; en conséquense on diminue systématiquement le nombre de coups.

          je vois pas pourquoi tu dit sa la diminution est bien du aux mauvaise lettres et non pas aux lettres saisie

          regarde je fais le teste et tout marche a part un petit souci je c'est pas pourquoi il y a ce point d'interrogation.

          [user@guillemot Debug]$ ./pendu 
          Bienvenue Dans le pendu
          
          
          il vous reste 10 coups
          
          Quel est le mot secret?*****
          Proposer une lettre 
          R
          il vous reste 10 coups
          
          Quel est le mot secret?R****
          Proposer une lettre 
          k
          il vous reste 9 coups
          
          Quel est le mot secret?*****
          Proposer une lettre 
          e
          il vous reste 9 coups
          
          Quel est le mot secret?****R
          Proposer une lettre 
          o
          il vous reste 9 coups
          
          Quel est le mot secret?*RO***
          Proposer une lettre 
          f
          il vous reste 8 coups
          
          Quel est le mot secret?*****
          Proposer une lettre 
          
          [user@guillemot Debug]$ 
          


          voila comment je vois mon code:
          bon alors au départ je crée un tableau pour stocker le mot secret puis je crée un pointeur lettreBonne je crée une variable de type char et pour le reste des variable ...
          je crée une boucle tant que nombre de coups est superieur a 0 ou que la comparaison des tableau entre motSecret et lettreBonne sont different la boucle continuerat
          puis après je crée un tableau dinmyque en allouant de la mémoire.
          puis j'affiche la bienvenue et le nombre de coups qui lui reste etc ...
          Dans la boucle for je fais tant que i est inferieur a le nombre de lettre que contien le mot secret alors elle continurat.
          Donc dans cette boucle je fais une condition si motsecret[i] == lettre
          alors je stocke la lettre dans un tableau afin de la conserver et apres je l'affiche.
          puis si cette condition est pas respecter alors on passe au else et on affiche une etoile a la place de la lettre .

          Donc comme au départ rien a été entrer il ny a eu aucune lettre tout les lettre seront remplacer par *****
          et c'est la que je propose de tapez une lettre et je fais une condition,
          si la fonction strchr retourne NULL c'est qu'il a pas tapez la bonne lettre donc j'enleve un nbreCoups
          puis il y a une autre condition: si la fonction qui comparre les 2 tableau renvoie 0 c'est que les mots sont identique donc a ce moment la on sort de la boucle while et on libere la mémoire allouer donc il n'ya aucun problèe normalement dans ce code et pourtant si !!!!!
          1. Contributeur
            erreur de débutant:
            lettreBonne = malloc(nbreLettre * sizeof(char));
            tu n'as rien pérvu poru stocker le \0: c'est la fin de chaine ....

            lettreBonne = malloc( (nbreLettre+1) * sizeof(char));

            sans ca, tu va faire un buffer overflow (enfin, ton programme va marcher, jusqu'au moment ou il marchera plus suite à l'ajout d'une variable et que tu ne saura absolument pas pourquoi!)
        2. alors là j'ai pas tout suivie pourquoi mon programme ne marcheras plus suite a l'ajout d'une variable ????
          1. Contributeur
            c'est meme pire que ce que je pensait:

            int nbreCoups = 10, i = 0, nbreLettre = 0; //le nombre de coups qui reste a l'utilisateur et une variable pour une boucle

            lettreBonne = malloc(nbreLettre * sizeof(char));

            nbrlettre est égal à zéro chez toi ....

            bon, et pour en revenir à nos moutons...
            si tu veux stoquer ROUGE (chaine de 5 caractères), combien de cases faut il prévoir dans ton tableau ?
          2. @Nabla'sben je doit prévoir 6 avec le '\0'

            sinon dans ton explication de nbreLettre
            je doit mettre
            int nbreCoups = 10, i = 0, nbreLettre = 5;

            car nbreLettre doit contenir 5 caractere "ROUGE" et a l'allocation je met (nbreLettre + 1) ce qui fait 5+1 = 6 6 caractere avec le '\0'
            c'est sa ou s'est hors sujet ???
          3. @Nabla'sok mais il reste toujours un problème
            voici le code :
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            #include "prototype.h"
            int main()
            {
                char motSecret[] = "ROUGE", *lettreBonne = NULL; // Tableau pour stocker le mot
                char lettre = 0; // variable de type char qui sert a reconvertir le nbre stocker en lettre
                int nbreCoups = 10, i = 0, nbreLettre = 5; //le nombre de coups qui reste a l'utilisateur et une variable pour une boucle
            
                lettreBonne = malloc((nbreLettre + 1) * sizeof(char));
                printf("Bienvenue Dans le pendu\n\n\n"); // on affiche la bienvenue
            
                /*
                 On fait une boucle tant que nombre de coups
                est superieur a 0 alors elle affiche le contenue ...
                */
                while(nbreCoups > 0 || strcmp(lettreBonne, motSecret) != 0)
                {
                    printf("il vous reste %d coups\n\n", nbreCoups);
                    printf("Quel est le mot secret?");
            
                       for(i = 0; i < strlen(motSecret); i++) // une boucle pour afficher les *****
                       {
                           if(motSecret[i] == lettre) // si lettre elle existe alors affiche la
                           {
                               lettreBonne[nbreLettre] = lettre;// On stocke la lettre dans un tableau si c'est la bonne
                               printf("%s", lettreBonne);
                           }
                           else // sinon affiche une étoile
                           {
                               printf("*");
                           }
                       }
                        printf("\nProposer une lettre \n");
                        lettre = lireCaractere(); // On stocke le caractere returner dans lettre
            
                       if(strchr(motSecret, lettre) == NULL)
                       {
                           nbreCoups--;
                       }
                       if(strcmp(motSecret, lettreBonne) == 0)
                       {
                           printf("BRAVO !!!! vous venez de truover le mot secret\n");
                       }
                }
                free(lettreBonne);
                return 0;
            }
            


            voici ce que sa m'affiche quand je teste mon programme
            [user@guillemot Debug]$ ./pendu 
            Bienvenue Dans le pendu
            
            
            il vous reste 10 coups
            
            Quel est le mot secret?*****
            Proposer une lettre 
            R
            il vous reste 10 coups
            
            Quel est le mot secret?****
            Proposer une lettre 
            K
            il vous reste 9 coups
            
            Quel est le mot secret?*****
            Proposer une lettre 
            G
            il vous reste 9 coups
            
            Quel est le mot secret?****
            Proposer une lettre 
            
            [user@guillemot Debug]$ 
            


            et il y aussi un autre probleme que je n'ai pas commpris pourquoi avoir mit un tableau dinamyque alors que un tableau de taille 6 aurait suffit du genre lettreBonne[6] = "";

            On ma donner sa comme explication a propos du tableau dinamyque
            gras>lettreBonne[6] = "" (dans la déclaration) ---> tu ferais mieux de déclarer un pointeur, et d'uy affecter ton tableau de char en dynamique (puisque plustard tu vas avoir des mots différents de 6 lettres, et le remplir par des * et finir par le \0 de fin de chaine <gras>

            mais ce que je comprend pas dans cette explication c'est qu'il dit puisque plutard je vais avoir des mot de 6 caractere .
            C'est pas possible puisque les caractere seront limiter a 5 puisque mon tableau lettreBonne[6] contient 5+1('\0') donc 6 donc même si c'est un mot different le temps qu'il contient 5 caractere il y aura pas de problème ???
        3. ah ben si en faite peut etre que ta raison dans ma boucle for j'ai mis:
          lettreBonne[i] = lettre;


          alors que je devrais mettre
          lettreBonne[nbreLettre] = lettre;


          c'est bien sa ou je suis hor sujet
          1. Contributeur
            en fait, quand tu faisait lettreBonne[6] = "" tu créait une constante. théoriquement, t'as pas le droit de la modifier.

            tu as d'ailleurs pas fait, lors de la correction, tu n'as pas mis de '\0' la chaine.

            ce que je te disait, au niveau du tableau dynamique, c'est surtout que le but de ton jeu, ca va pas etre (à terme) de toujorus trouver "rouge". Le but va etre d'avoir un endroit ou trouver les mots. et ces mots vont des fois faire plus de 6 caractères. donc il faut gérer tout ca de manière dynamique. tu devrais donc meme avoir:
            nbreLettre = strlen(motSecret);
            1. ah ok moi qui croyais que mon tableau étais incorrecte.

              sinon il me reste toujours ce probleme dans le code quand je teste le programme sa me fais sa :
              [user@guillemot Debug]$ ./pendu 
              Bienvenue Dans le pendu
              
              
              il vous reste 10 coups
              
              Quel est le mot secret?*****
              Proposer une lettre 
              R
              il vous reste 10 coups
              
              Quel est le mot secret?****
              Proposer une lettre 
              G
              il vous reste 10 coups
              
              Quel est le mot secret?****
              Proposer une lettre 
              
              [user@guillemot Debug]$ 
              


              pourquoi la quand je tape une lettre juste je passe au else sa devrais plutot la stocker dans uin tableau ??