Se connecter / S'enregistrer

Résolu Probleme en C

Solutions (6)
Tags :
  • Programme
  • Programmation
, Programmation (collector) |
bonjour a tous, je fais de nouveau appelle a vous car je rencontre encore des problemes avec mon code source.
Mon code marche comme il le faut, mais j'ai un probleme d'affichage sur la console.
Lorsque j'execute mon code, le programme demande a l'utilisateur doit entrer une lettre pour le comparer avec celui du mot a trouver, seul probleme, lorsque celui ci affiche le tableau de caractere de l'utilisateur (motUtilisateur)
on voit s'afficher "??????CMDxdp" alors que normalement il devrait afficher "??????" et je n'arrive pas a comprendre pourquoi.
De plus ce que je trouve le plus bizarre, c'est que ce probleme n'arrive pas avec les mots contenants 7 lettres, mais pour les mots contenant en dessous de 7 et au dessus de 7, le probleme au niveau de l'affichage et j'aimerai que vous m'aidiez a regler ce probleme

Avanr de vous donner le code source j'aimerai avoir une petite remarque de votre part, j'aimerai savoir si selon vous, ce que je fait est mal organiser ou bien du bidouillage (soyez sincere) car selon mon prof, ce que je fait c'est vraiment n'importe quoi.

Voila merci a tous, voici le code :

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "PrototypesFonctions.h"
  5. #define TAILLE 20
  6.  
  7.  
  8.  
  9. int main(void)
  10. {
  11. // DECLARATION .....
  12.  
  13. int tailleMot, i = 0;
  14. char motAchercher[TAILLE] = "", lettreUtilisateur[3] = ""; // initialisation au moment de la declaration
  15. char *motUtilisateur = NULL;
  16. char *positionE = NULL;
  17. FILE * fichier = NULL;
  18.  
  19.  
  20. /*--------------------------------------------------------------------------*/
  21.  
  22. fichier = fopen("listeMots.txt", "r"); // retourne un descripteur de fichier en memoire pour lire et/ou ecrire
  23.  
  24. if (fichier != NULL)
  25. {
  26. rewind(fichier);
  27. fgets(motAchercher, TAILLE, fichier); // fgets lit TAILLE caractere dans le fichier et le stock dans le tableau motAchercher
  28. // retourne null si il echoue ou arrive a la fin du fichier
  29.  
  30. }
  31. else
  32. {
  33. printf ("le fichier n\' pas pu être ouvert en lecteur seule\n");
  34. exit(1);
  35. }
  36.  
  37. tailleMot = strlen(motAchercher);
  38.  
  39.  
  40. printf("Le mot a trouve comporte %d lettres\n", tailleMot-1);
  41. printf("bonne chance !\n\n");
  42.  
  43.  
  44. motUtilisateur = malloc(tailleMot * sizeof(char));// allocation dynamique de memoire en fonction du nombre de lettre situe dans motAchercher
  45.  
  46. motAchercher[strlen(motAchercher)-1] = '\0'; // je remplace le caractere \n que fgets a prit par \0 pour indiquer la fin de la chaine
  47.  
  48. while (i < tailleMot - 1)
  49. {
  50. *(motUtilisateur + i) = '?';
  51. i++;
  52. }
  53.  
  54.  
  55. while (strcmp(motAchercher, motUtilisateur) != 0)
  56. {
  57.  
  58. printf ("saisissez une lettre : \n");
  59. LireClavier (lettreUtilisateur, 3);
  60. ChercherEtRemplacerLettre(motUtilisateur, lettreUtilisateur, motAchercher, tailleMot);
  61. printf("%s\n", motUtilisateur);
  62. }
  63.  
  64.  
  65.  
  66. printf("Vous venez de trouvez le mot : %s \n", motUtilisateur);
  67. printf("Nous vous en felicitons\n");
  68.  
  69.  
  70.  
  71. if (fclose(fichier) == EOF) // renvoi EOF si une erreur est survenu
  72. {
  73. printf("un probleme est apparue lors de la fermeture du fichier\n");
  74. }
  75. else
  76. {
  77. printf("fermeture du fichier reussi\n");
  78. }
  79.  
  80. free(fichier);
  81.  
  82. return 0;
  83. }
Contenus similaires
Meilleure solution
partage
|
Pas de '\0' dans motUtilisateur (qui est ce que tu affiches). Le '\0', tu ne l'as mis que dans motAchercher

  • Commenter cette solution |
Score
0
òh
òi
, Programmation (collector) |
Meilleure réponse sélectionnée par wahhh.
  • Commenter cette réponse |
Score
0
òh
òi
, Programmation (collector) |
aah !!!! lol oui en effet, j'avais completement oublié que c'etait une chaine de caractere .... et moi qui cherchait l'erreur depuis je ne sais combien de temps .... j'ai rien vu venir.
En tout cas je te remercie enormement pour ton aide, sans toi je pense pas que j'aurai trouvé la solution a ce probleme si simple ....
Encore une fois MERCI CRicky
  • Commenter cette réponse |
Score
0
òh
òi
, Programmation (collector) |
personne ?
  • Commenter cette réponse |
Score
0
òh
òi
, Programmation (collector) |
CRicky je te remercie pour tes remarques que je prendrai en compte dès que j'ai l'occasion de coder de nouveau.
Pour ce qui est de la gestion du caractere de fin de chaine, si je l'aurai vraiment mal gerer, le probleme serait egalement present pour les mots contenant 7 lettres, logiquement. Si tu regarde bien a la ligne 46 j'ecrase le \n pour mettre \0 et ensuite a la ligne 48 j'affiche les ? en fonction du nombre de lettre donc 6 ? pour un mot de 6 lettres, il n'y a donc (a mes yeux) aucun probleme
  • Commenter cette réponse |
Score
0
òh
òi
|
Pour ton problème, sans voir le code, j'imagine que c'est parce que tu ne gères pas bien la fin de chaine avec le '\0' qui permet de terminer une chaine en C, et tu fais du buffer overflow.

Maintenant concernant ton code, voilà comment rendre ton code un peu plus professionnel:
- le commentaire "DECLARATION" ne sert à rien, et ce qui ne sert à rien est à virer.
- Tes variables sont correctement nommées, mais pour les pointeurs, j'ajouterais un petit 'p' devant pour indique un pointeur. Exemple: pMotUtilisateur
- Ton code est mal commenté: il ne faut pas indiquer ce que ça fait d'un point de vue technique (par exemple "retourne un descripteur de fichier"), mais ce que ça fait d'un point de vue fonctionnel (par exemple: "Ouverture du fichier contenant la liste de mots"). Encore une fois, l'explication technique ne sert à rien, car en lisant la ligne de code, on sait ce que ça fait. Il faut écrire un commentaire pour une personne qui maitrise ce langage de programmation, mais qui ne sait pas ce que fait le programme. Autre exemple, pour les boucle, il dire sur quoi tu fais la boucle (sur une liste un tableau de quelque chose), toujours d'un point de vue fonctionnel.
Ce commentaire "je remplace le caractere \n que fgets a prit par \0 pour indiquer la fin de la chaine " est un bon commentaire, mais je considère que c'est le seul commentaire de ton programme

Pour lire simplement, il faut faire des fonctions avec, pour chaque fonction, la description de la fonctions des paramètres et valeur de retour (toujours d'un point de vue fonctionnel). Pour moi, le main() ne doit pas avoir une seule boucle.

Un fichier se ferme une fois la lecture terminée, car déjà lorsqu'on lit la suite du code, on ne se soucie plus du fichier, et ça t'assure que tu fermes bien le fichier correctement.

Il faut être d'autant est plus clair que les professeurs d'informatique ne sont pas forcément les meilleurs développeurs, mais ils savent programmer.
  • Commenter cette réponse |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS