Petit probleme tout bete (printf/scanf)

Petit probleme tout bete (printf/scanf) - C - Programmation

Marsh Posté le 30-12-2003 à 15:05:41    

Code :
  1. main()
  2. {
  3.    char c='a';
  4.    while(c!='0' && c!='1')
  5.    {
  6.       printf("Valider ? (0 pour non | 1 pour oui) : " );
  7.       c=getchar();
  8.    }
  9. }


Quand je rentre 0 ou 1 ca marche, je sors de la boucle mais si je rentre un caractere autre que 0 ou 1 ca me fait ca :

Valider ? (0 pour non | 1 pour oui) : 5  //je rentre 5
Valider ? (0 pour non | 1 pour oui) : Valider ? (0 pour non | 1 pour oui) :

 
 
Pourquoi ca m'affiche 2 fois mon prinft sans me demander d'entrer le caractere ?
 
PS : si je remplace le char par un entier ca marche. Mais pourquoi avec un char ca marche pas ? :??:

Reply

Marsh Posté le 30-12-2003 à 15:05:41   

Reply

Marsh Posté le 30-12-2003 à 15:13:29    

faut faire un flush du buffer après le getchar.

Reply

Marsh Posté le 30-12-2003 à 15:27:21    

MagicBuzz a écrit :

faut faire un flush du buffer après le getchar.

j'ai rajoute fflush(stdin) apres mon getchar mais ca ne change rien [:morpheus67] (c'est bien ca qu'il fallait faire  :??: )
 

Reply

Marsh Posté le 30-12-2003 à 15:43:26    

bon, je viens de lire sur le forum que sur la majorite des systems fflush(stdin) ne marche pas et qu'il faut vider le buffer "a la main". Comment on fait ?


Message édité par morpheus67 le 30-12-2003 à 15:43:39
Reply

Marsh Posté le 30-12-2003 à 15:45:42    

Je peux pas te dire :D
Je me souviens juste que j'avais eu ce problème un coup il y a 6 ans quand j'ai fait du C pendant un TP en cours :D

Reply

Marsh Posté le 30-12-2003 à 17:39:43    

C'est moi, ça ça marche :  

Code :
  1. #include <stdio.h>
  2. #define CLEAR_STDIN { int c; while((c = getchar()) && (c != '\n')); }
  3. int main()
  4.   {
  5.        char c='a';
  6.    
  7.        while(c!='0' && c!='1')
  8.        {
  9.             printf("Valider ? (0 pour non | 1 pour oui) : " ); 
  10.             c=getchar();
  11.     CLEAR_STDIN;
  12.        }
  13. return (0);
  14.   }


 
J'ai chopé la macro là http://membres.lycos.fr/cultc/astuces.htm


Message édité par gronwell le 30-12-2003 à 17:40:53
Reply

Marsh Posté le 30-12-2003 à 17:42:22    

Pour vider ton buffer :

Code :
  1. while(getchar() != '\n');

Reply

Marsh Posté le 30-12-2003 à 17:51:06    

impeccable, vos 2 solutions marchent très bien :jap:

Reply

Marsh Posté le 30-12-2003 à 19:43:43    

morpheus67 a écrit :

j'ai rajoute fflush(stdin) apres mon getchar mais ca ne change rien [:morpheus67] (c'est bien ca qu'il fallait faire  :??: )
 
 


 
Taz troll detected

Reply

Marsh Posté le 30-12-2003 à 19:45:44    

red faction a écrit :


 
Taz troll detected


j'ai rajoute ce qu'on m'a dit mais j'ai vite remarque que ca ne marchait pas :D

Reply

Marsh Posté le 30-12-2003 à 19:45:44   

Reply

Marsh Posté le 30-12-2003 à 20:50:49    

ToxicAvenger a écrit :

scanf caÿ mal (http://www.isty-info.uvsq.fr/~rumeau/fclc/fclc008.html#q_8)
 
Utilises plutot fgets

Où t'as vu un scanf ? :heink:

Reply

Marsh Posté le 30-12-2003 à 20:52:04    

*syl* a écrit :

Où t'as vu un scanf ? :heink:  


 
dtc ? [:zaib3k]

Reply

Marsh Posté le 30-12-2003 à 20:53:43    

On a un comique parmi nous [:petrus75]

Reply

Marsh Posté le 30-12-2003 à 20:57:39    

*syl* a écrit :

On a un comique parmi nous [:petrus75]


 
ouais j'ai enculé un clown ce week end  [:greenleaf]

Reply

Marsh Posté le 02-01-2004 à 23:54:46    

*syl* a écrit :

Où t'as vu un scanf ? :heink:  


 
Dans le titre [:evil-raphiscorn]

Reply

Marsh Posté le 03-01-2004 à 00:00:25    

ToxicAvenger a écrit :


 
Dans le titre [:evil-raphiscorn]  

T'y as déjà répondu crétin, j'te l'rappele  [:evil-raphiscorn]  

Reply

Marsh Posté le 03-01-2004 à 00:23:28    

*syl* a écrit :

T'y as déjà répondu crétin, j'te l'rappele  [:evil-raphiscorn]  
 


 
oui mais vu que t'avais pas capté que c'etait dans le titre, pauvre abruti, je me permets de le préciser explicitement  [:zebra33]

Reply

Marsh Posté le 03-01-2004 à 00:25:16    

ToxicAvenger a écrit :


 
oui mais vu que t'avais pas capté que c'etait dans le titre, pauvre abruti, je me permets de le préciser explicitement  [:zebra33]  

L'abruti c'est celui qui a pas compris que je parlais du message et qui n'a même pas pris le temps de le lire pour balancer son lien à 2 balles :sarcastic:  

Reply

Marsh Posté le 03-01-2004 à 00:57:27    

mais vous êtes timbrés ou quoi ?
 
1) faut flusher stdout fflush(stdout)
2) fflush(stdin) ne sert à rien et n'a aucun effet sur les flux d'entrées
3) effectivement on récupère le '\n'
4) faut traiter le cas de EOF

Reply

Sujets relatifs:

Leave a Replay

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