Probleme réalisation d'un pendu en c ...

Résolu/Fermé
Signaler
Messages postés
10
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
5 avril 2010
-
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
-
Bonjour,
j'apprends à programmer en c, et je souhaite réaliser le jeu du pendu ... mais le probleme est que la version que j'ai créée ne marche que pour des mot d'une certaine longueur ... (marche pour 3, 4, 5, 7 lettres)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fonction.h"

int main(int argc, char *argv[])
{
char lettre, motsecret[] = "MARRON";
int nbcoups = 10, longueurmot, longueursuitemot, i = 0;
longueurmot = strlen(motsecret);

char *suitemot, *mot = NULL;
mot = malloc(longueurmot * sizeof(char));
if(mot == NULL)
{
exit(0);
}

for(i = 0; i < longueurmot; i++)
{
mot[i] = '*';
}

printf("===== BIENVENUE DANS LE JEU DU PENDU =====\n\n\n");

while (nbcoups != 0 && strcmp(motsecret, mot) != 0)
{
printf("Il vous reste %d coups a jouer\n", nbcoups);
printf("Quel est le mot secret ? %s \n", mot);


// le probleme survient avant cette ligne car l'affichage de "mot" ne donne pas que des ' * ' ...


printf("Proposez une lettre : ");
lettre = lirecaractere();
printf("\n\n");
suitemot = strchr(motsecret, lettre);

if (suitemot != NULL)
{
do
{
longueursuitemot = strlen(suitemot);
mot[longueurmot - longueursuitemot] = lettre;
suitemot++;
suitemot = strchr(suitemot, lettre);
}while(suitemot != NULL);
}
else
{
nbcoups--;
}

}

if (nbcoups == 0)
{
printf("Vous avez perdu !!! le mot etait : %s \n\n", motsecret);
}
else
{
printf("Gagne ! le mot etait bien : %s ^^\n\n", motsecret);
}
free(mot);

system("PAUSE");
return 0;
}
help me please ^^ et bonne année

3 réponses

Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
146
Quelques extraits de ton code:
char lettre, motsecret[] = "MARRON";
int nbcoups = 10, longueurmot, longueursuitemot, i = 0;
longueurmot = strlen(motsecret);
mot = malloc(longueurmot * sizeof(char));
for(i = 0; i < longueurmot; i++)
  mot[i] = '*';
while (nbcoups != 0 && strcmp(motsecret, mot) != 0)
suitemot = strchr(motsecret, lettre);
On voit de suite que tu vas avoir un problème;
- strlen(motsecret) renvoie 6 (caractères),
- malloc réserve une zone de 6 caractères,
- mot[i] = '*' remplit les 6 premiers caractères de mot à '*',
- jusque là il n'y a pas de problèmes,
- strcmp(motsecret, mot) ne devrait pas poser de problèmes mais ne devrait pas toujours donner le résultat escompté,
- suitemot = strchr(motsecret, lettre) ne devrait pas toujours donner le résultat escompté et devrait poser des problèmes.
Explication: Le mot 'secret' a bien une longueur de 6 caractères représentatifs mais, en 'C', les chaînes de caractères doivent se terminer par un '\0' et les fonctions du 'C' traitant les chaînes de caractères tiennent compte et même exploitent cette caractéristique; ce qui signifie qu'une fonction comme 'strchr' va rechercher le caractère 'lettre' dans la chaîne 'motsecret' et cette recherche va s'effectuer jusqu'à rencontrer 'lettre' (recherche positive) ou la fin de chaîne (recherche négative). Or comme tu n'as pas mis de fin de chaîne, le '\0' peut être rencontré bien au-delà du mot et te retourner un pointeur sur n'importe quoi ou te retourner un 'segment fault' pour avoir tenter de travailler dans une zone mémoire non autorisée.
Bonne réflexion.
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41989 internautes nous ont dit merci ce mois-ci

Messages postés
10
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
5 avril 2010

merci, le probleme est résolu grace a l'ajout d'une seule et unique ligne ^^ : mot[longueurmot] = '\0'; juste apres la boucle qui met des ' * ' ^^
a+
par contre le probleme était qu'il affichait (a la place d'uniquement des ***** au début de la partie), d'autre signe ... comme ****§#' _♠○, ... et cela que pour une certaine longueur de mot...
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
146
Ton post étant passé en 'résolu', je ne sais pas si tu le liras, mais je réponds quand même.
Tu as l'impression que ton problème est résolu, mais pas du tout.
mot[longueurmot] = '\0';
Tu écris dans une case qui n'est pas autorisée !
Tu as réservé une zone de 6 caractères et rempli cette zone de 6 caractères avec des '*'; ensuite tu écris un '\0' dans le septième caractère mais ta zone ne fait que 6 caractères !
Conclusion: pour pouvoir mettre un mot de 6 caractères, en 'C' il faut allouer une zone de 7 caractères (6 pour les lettres du mot + 1 pour le caractère final).
La solution sera donc:
  mot = malloc ( (longueurmot+1) * sizeof(char));
Bonne réflexion.