Probleme code

anthony -  
 anthony -
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();

8 réponses

anthony
 
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
0
Nabla's Messages postés 20731 Statut Contributeur 3 194
 
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
0
loupius
 
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.
0
anthony
 
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 !!!!!
0
Nabla's Messages postés 20731 Statut Contributeur 3 194
 
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!)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
anthony
 
alors là j'ai pas tout suivie pourquoi mon programme ne marcheras plus suite a l'ajout d'une variable ????
0
Nabla's Messages postés 20731 Statut Contributeur 3 194
 
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 ?
0
anthony > Nabla's Messages postés 20731 Statut Contributeur
 
ben 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 ???
0
Nabla's Messages postés 20731 Statut Contributeur 3 194 > anthony
 
en effet, c'est bien ca
0
anthony > Nabla's Messages postés 20731 Statut Contributeur
 
ok 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 ???
0
anthony
 
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
0
Nabla's Messages postés 20731 Statut Contributeur 3 194
 
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);
0
anthony
 
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 ??
0