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

Résolu/Fermé
lerac44 Messages postés 10 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 5 avril 2010 - 2 janv. 2010 à 12:41
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 - 4 janv. 2010 à 18:07
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

loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
2 janv. 2010 à 20:13
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
lerac44 Messages postés 10 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 5 avril 2010
4 janv. 2010 à 16:37
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...
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
4 janv. 2010 à 18:07
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.
0