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
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
A voir également:
- Probleme réalisation d'un pendu en c ...
- Jeu du pendu - Télécharger - Vie quotidienne
- Réaliser un organigramme - Guide
- Taux de réalisation - Forum Excel
- Calcul du pourcentage avec le chiffre atteint. ✓ - Forum Excel
- S'entrainer a realiser des films dans la ville d'un voisin - Forum Jeux vidéo
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
2 janv. 2010 à 20:13
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.
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
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...
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...
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
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:
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.