Probleme réalisation d'un pendu en c ...
Résolu
lerac44
Messages postés
10
Date d'inscription
Statut
Membre
Dernière intervention
-
loupius Messages postés 697 Date d'inscription Statut Membre Dernière intervention -
loupius Messages postés 697 Date d'inscription Statut Membre Dernière intervention -
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
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
A voir également:
- Probleme réalisation d'un pendu en c ...
- Jeu du pendu - Télécharger - Vie quotidienne
- Réaliser un organigramme - Guide
- Réaliser un camembert graphique - Guide
- Jason a réalisé un photo-montage pour tromper et amuser ses camarades. il a modifié un élément sur une photo de neil armstrong marchant sur la lune. lequel ? - Forum Jeux vidéo
- Comment réaliser un graphique sur excel - Guide
3 réponses
Quelques extraits de ton code:
- 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.
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.
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...
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...
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:
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.