Probleme code
anthony
-
anthony -
anthony -
Bonjour,
voila je veus réaliser un pendu voila le code que j'ai fais
main.c :
fonction.c:
et voici le fichier prototype.h
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();
A voir également:
- Probleme code
- Code ascii - Guide
- Code puk bloqué - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code activation windows 10 - Guide
- Scanner qr code pc - Guide
8 réponses
ah oui est j'aioublier d'afficher le resultat du code bon voila ce que sa donne
je ne comprend pas pourquoi il remplace G par R
[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
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
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
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.
- 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.
bon alors tout d'abord voila le news code avec les correction que vous m'avez conseillez:
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.
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 !!!!!
#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 !!!!!
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!)
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!)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
alors là j'ai pas tout suivie pourquoi mon programme ne marcheras plus suite a l'ajout d'une variable ????
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 ?
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 ?
ben je doit prévoir 6 avec le '\0'
sinon dans ton explication de nbreLettre
je doit mettre
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 ???
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 ???
ok mais il reste toujours un problème
voici le code :
voici ce que sa m'affiche quand je teste mon programme
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 ???
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 ???
ah ben si en faite peut etre que ta raison dans ma boucle for j'ai mis:
alors que je devrais mettre
c'est bien sa ou je suis hor sujet
lettreBonne[i] = lettre;
alors que je devrais mettre
lettreBonne[nbreLettre] = lettre;
c'est bien sa ou je suis hor sujet
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);
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);
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 :
pourquoi la quand je tape une lettre juste je passe au else sa devrais plutot la stocker dans uin tableau ??
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 ??