Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1463 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1720697
spolnix
Posté le 20-04-2008 à 23:42:28  profilanswer
 

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 ?

mood
Publicité
Posté le 20-04-2008 à 23:42:28  profilanswer
 

n°1720705
olivthill
Posté le 21-04-2008 à 00:41:19  profilanswer
 

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
n°1720966
spolnix
Posté le 21-04-2008 à 13:44:00  profilanswer
 

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

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

n°1721160
delphin2
Soyons libre de droit
Posté le 21-04-2008 à 16:47:55  profilanswer
 

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

n°1721227
spolnix
Posté le 21-04-2008 à 18:28:37  profilanswer
 

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.

n°1721257
Trap D
Posté le 21-04-2008 à 19:04:00  profilanswer
 

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.

n°1721294
Sve@r
Posté le 21-04-2008 à 20:15:20  profilanswer
 

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.
n°1723521
spolnix
Posté le 24-04-2008 à 12:16:42  profilanswer
 

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.

n°1723560
Elmoricq
Modérateur
Posté le 24-04-2008 à 13:33:42  profilanswer
 

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().


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
[PHP] Problème avec la un script tout simpleproblème d'execution d'un programme
fonction window de turbo C/C++Problème décallage IE par rapport à FF et Opera
[MySQL] - Problème aux extrêmes...problème avec une variable
problème de connect avec le SIGNAL itemClicked(item) avec Qtpassage d'un tableau dans une fonction
Mapping NHibernate probleme <composite-id>problème de connection avec une bdd oracle
Plus de sujets relatifs à : Problème en C : ma fonction recupere un '\n'


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR