IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

scanf doublé dans un while


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut scanf doublé dans un while
    Bonjour,

    Je débute tout juste en C. Dans mon programme j'ai une anomalie que je n'arrive pas à comprendre.

    Voici l'extrait du code (version simplifée):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char *argv[])
    {
    	char caractereARechercher = 0;
    	while(1)
    	{
    		printf("Lettre à rechercher: \n");
    		scanf("%c", &caractereARechercher);
    		printf("Lettre saisie: %c\n", caractereARechercher);
    	}
      return EXIT_SUCCESS;
    }
    Lorsque j'execute mon programme, j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Lettre à rechercher:
    a
    Lettre saisie: a
    Lettre à rechercher:
    Lettre saisie:
     
    Lettre à rechercher:
    b
    Lettre saisie: b
    Lettre à rechercher:
    Lettre saisie:
     
    Lettre à rechercher:
    Dans cet exemple, j'ai saisie a + <ENTER>, puis b + <ENTER>. Le soucis est qu'à chaque fois, j'ai une saisie vide. Je n'arrive pas à comprendre où est mon erreur.

    Au cas où, voici mon code complet avec seulement la partie qui m'interresse. Le reste est en commentaire.
    On est d'accord, le while(1), c'est juste pour l'exemple, dans mon code, c'est normalement un autre while.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char *argv[])
    {
    	/****************
            DECLARATION DES VARIABLES
            ****************/
    	char caractereARechercher = 0;
    	/* DEBUG
    	char motATrouver[5];
    	char isLettreTrouver = 0;
    	int nombreDeVies = 0;
    	int etatPartie = 0;
    	int isMotTrouve = 0;	
     
    	//Debut du jeu
    	printf("Bonjour et bienvenu dans Pendu\n");
    	printf("Quel mot faut-il trouver ? ");
    	//scanf("%s", motATrouver); 
     
    	motATrouver[0] = 't';
    	motATrouver[1] = 'e';
    	motATrouver[2] = 's';
    	motATrouver[3] = 't';
    	motATrouver[4] = '\0';
     
    	//motATrouver = 'test';
    	printf("%s\n", motATrouver);
     
    	printf("Combiens de vies pour cette partie ? ");
    	//scanf("%ld", &nombreDeVies);
    	nombreDeVies = 10;
    	printf("%ld\n", nombreDeVies);
    	//scanf("%c", &caractereARechercher);
    	//Debut de la partie
     
    	while (etatPartie == 0)
    	******** FIN DEBUG */
    	while(1)
    	{
    		//Proposer la recherche
    		printf("Lettre à rechercher: \n");
    		scanf("%c", &caractereARechercher);
    		printf("Lettre saisie: %c\n", caractereARechercher);
     
    		//printf("%c\n",caractereARechercher);
    		//Recherche la lettre
    		//char* strchr(const char* chaine, int caractereARechercher);
    		/*
    		isLettreTrouver = strchr(motATrouver, caractereARechercher);
    		if (isLettreTrouver != NULL)
    		{
    			printf("Oui! La lettre est présente !\n");
    			//nombreDeVies--;
    		}else{
    			nombreDeVies--;
    			printf("Dommage, la lettre n'est pas présente. Il vous reste %ld vie(s)\n",nombreDeVies);
    		}
     
    		//Mise à jour de l'état de la partie
    		if (nombreDeVies == 0) {etatPartie = 1;}
    		if (isMotTrouve == 1) {etatPartie = 2;}
    		*/
    	}
     
    	/*DEBUG
    	//Fin de la partie
    	switch (etatPartie)
    	{
    		case 1:
    			printf("Perdu! La solution était: %s\n", motATrouver);
    		break;
    		case 2:
    			printf("Gagné! La solution était: %s\n", motATrouver);
    		break;
    	}
     
    	//Fin du jeu
    	printf("A bientôt !\n");
    	******* FIN DEBUG */
     
      return EXIT_SUCCESS;
    }
    Désolé si mon problème est vraiment bidon ...
    Merci de votre aide.

    Bonne soirée.
    Salokine.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut il faut vider le buffer
    Désolé d'avoir posé une question stupide.

    A priori, mes <ENTER> reste dans le buffer.
    Donc j'ai trouvé ça comme alternative:

    Je termine mon scanf par une purge du buffer pour être sûr qu'il n'y a plus rien qui traine dans le buffer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char *argv[])
    {
            char caractereARechercher = 0;
            while(1)
            {
                    printf("Lettre à rechercher: \n");
                    scanf("%c", &caractereARechercher);
                    int c = 0;
    		while (c != '\n' && c != EOF)
    		{
    			c = getchar();
    		}
                    printf("Lettre saisie: %c\n", caractereARechercher);
            }
      return EXIT_SUCCESS;
    }
    Si vous connaissez un truc plus simple, je suis preneur.
    Merci tout de même et bonne soirée.
    Salokine.

  3. #3
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par salokine Voir le message
    Dans cet exemple, j'ai saisie a + <ENTER>, puis b + <ENTER>. Le soucis est qu'à chaque fois, j'ai une saisie vide. Je n'arrive pas à comprendre où est mon erreur.
    La saisie vide correspond à la lecture du <ENTER>.

    En gros lors du premier passage, tu tapes a et \n. scanf() "consomme" bien le a mais le \n reste dans le tampon.
    Lors du deuxième passage, puisqu'un \n est présent, scanf() consomme immédiatement le premier caractère du tamponsoit le \n et le programme reboucle et là la saisie est de nouveau effectué.

    Il est nécessaire après une saisie de s'assurer qu'il ne reste pas de caractères parasites dans le tampon d'entrèe et si nécessaire de vider ce tampon.

    Je te renvoie à c tutoriel: Scanf démythifiée pour l'utilisation de scanf().
    Ceci étant il est généralement préférable et plus simple (et c'est tout à fait le cas dans ton exemple), d'utiliser la fonction fgets().

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. scanf bypassé dans une boucle do-while (Langage C)
    Par Magrak dans le forum Windows
    Réponses: 2
    Dernier message: 09/09/2010, 10h32
  2. [CR8.5] Pbm d'affichage dans un While
    Par .:Tieri:. dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 14/07/2004, 10h17
  3. Réponses: 4
    Dernier message: 12/09/2003, 11h38
  4. Réponses: 3
    Dernier message: 25/11/2002, 14h15
  5. Réponses: 3
    Dernier message: 12/06/2002, 21h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo