Problème en C : ma fonction recupere un '\n'

Problème en C : ma fonction recupere un '\n' - C - Programmation

Marsh Posté le 20-04-2008 à 23:42:28    

Bonjour à tous,
Je débute en C et pour l'instant j'essaye de faire un petit programme en console: le jeu du pendu.
Lors de l'éxectution de ce jeu j'ai ce petit problème :
 
[img=http://img134.imageshack.us/img134/579/pendurj6.th.jpg]
 
Voila comme vous pouvez le remarquer lorsque je rentre pour la première fois ma lettre apparemment le programme récupère le '\n'
Voici le code :

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "jeu.h"
  5. long jeu(continu)
  6. {
  7. long compteur;
  8. char motSecret[] = "MARRON";
  9. char maLettre = 0;
  10. system("cls" );
  11. printf("Bienvenu dans le jeu du pendu !\n\n\n" );
  12. for (compteur = 10; compteur <= 10 && compteur != 0; compteur--)
  13. {
  14.  printf("Il vous reste %ld coup(s) a jouer\n", compteur);
  15.  printf("Quel est le mot secret ? \n" );
  16.  printf("Entrez une lettre: " );
  17.  maLettre = lireCaractere();
  18.  printf("\n%c\n\n", maLettre);
  19. }
  20. if (compteur == 0)
  21. {
  22.  printf("\n\nVous avez perdu ! Reesayez !\n\n" );
  23.  system("PAUSE" );
  24.  return continu = 0;
  25. }
  26. }
  27. //Equivalent à la fonction scanf  
  28. char lireCaractere()
  29. {
  30.     char caractere = 0;
  31.     caractere = getchar(); // On lit le premier caractère
  32.     caractere = toupper(caractere);
  33.     // On lit les autres caractères mémorisés un à un jusqu'à l'\n (pour les effacer)
  34.     while (getchar() != '\n') ;
  35.     return caractere;
  36. }


 
Je n'arrive pas a trouver la cause de ce petit problème pourriez vous m'aider ?

Reply

Marsh Posté le 20-04-2008 à 23:42:28   

Reply

Marsh Posté le 21-04-2008 à 00:41:19    

La ligne suivante est suspecte

while (getchar() != '\n') ;

Il y a un autre getchar un peu plus haut qui met le resultat dans la variable "caratère", mais pas ici, ce qui est un peu étrange. Le point virgule tout seul fait un peu pitié. D'habitude on met d'autres instructions que cette instruction vide à l'intérieur d'une boucle.
Edit : En fait, c'est peut-être normal.


Message édité par olivthill le 21-04-2008 à 00:43:15
Reply

Marsh Posté le 21-04-2008 à 13:44:00    

Alors oui cette manière d'écrire est un genre de raccourci ça équivaut à :

Code :
  1. while (getchar() != '\n')
  2.       {
  3.       }

Reply

Marsh Posté le 21-04-2008 à 16:47:55    

Effectivement si tu laisses le point virgule, le compilo aura du mal à comprendre les intructions

Reply

Marsh Posté le 21-04-2008 à 18:28:37    

Mais je ne veux pas éxecuter des instruction je veux juste lire l'ensemble des caractères pour vider le buffeur pour eviter des problèmes liés a la fonction scanf (compte le '\n' de la touche entrée).
Et si vous avez vu l'image vous pouvez constater que l'arreur se produit uniquement lors de la première execution. Les autres passages sur cette boucle fonctionnent parfaitement.

Reply

Marsh Posté le 21-04-2008 à 19:04:00    

Tant que tu ne donneras pas le programme complet avec ce qui se passe dans le main, on ne pourra pas répondre correctement, il manque des infos.

Reply

Marsh Posté le 21-04-2008 à 20:15:20    

delphin2 a écrit :

Effectivement si tu laisses le point virgule, le compilo aura du mal à comprendre les intructions


Mais où as-tu appris le C ??? C'est parfaitement correct et valable. Il s'agit d'une boucle sans instruction parce que ce qui est dans le while() est suffisant au besoin.
C'est comme pour compter le nb de lettres d'une chaine=> for (i=0; chaine[i] != '\0'; i++) ;
En fin de for, "i" contient le nb de lettres.
 

spolnix a écrit :

Alors oui cette manière d'écrire est un genre de raccourci ça équivaut à :

Code :
  1. while (getchar() != '\n')
  2.       {
  3.       }



Oui.  
 
 

spolnix a écrit :

Code :
  1. //Equivalent à la fonction scanf  
  2. char lireCaractere()
  3. {
  4.     char caractere = 0;
  5.     caractere = getchar(); // On lit le premier caractère
  6.     caractere = toupper(caractere);
  7.     // On lit les autres caractères mémorisés un à un jusqu'à l'\n (pour les effacer)
  8.     while (getchar() != '\n') ;
  9.     return caractere;
  10. }



 
Effectivement ça semble correct. Cependant ta fonction lireCaractere est un peu maladroite. Moi je te proposerais de passer par fgets() ce qui a l'avantage de te laisser ton buffer clean

Code :
  1. //Equivalent à la fonction scanf  
  2. char lireCaractere()
  3. {
  4.     char string[1024];
  5.     fgets(string, 1024, stdin);      // Ici le buffer stdin est clean
  6.     return (toupper(string[0]));
  7. }


 
Pour plus d'infos, tu peux aller voir ce site http://mapage.noos.fr/emdel/inputs.htm qui parle des saisies "solides" en C...


Message édité par Sve@r le 21-04-2008 à 20:23:43

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 24-04-2008 à 12:16:42    

Merci Sve@r je me suis renseigné sur la fonction fgets, elle est déjà beaucoup plus sécurisée même si elle est un peu plus complexe a utiliser que le bon vieux scanf ^^  
En tout cas merci pour ta solution.

Reply

Marsh Posté le 24-04-2008 à 13:33:42    

spolnix a écrit :

Merci Sve@r je me suis renseigné sur la fonction fgets, elle est déjà beaucoup plus sécurisée même si elle est un peu plus complexe a utiliser que le bon vieux scanf ^^


 
Bien au contraire, scanf() est largement plus difficile à utiliser que fgets().

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed