Partage
  • Partager sur Facebook
  • Partager sur Twitter

Boucle saute la scanf une fois sur deux

Scanf Char est ignoré une fois sur deux dans une boucle

Sujet résolu
    21 mai 2017 à 21:15:25

    Bonjour,

    Je commence l'exercice sur le pendu. Je suis tombé sur un problème que j'ai réussi à résoudre avec l'aide de google mais s'en vraiment comprendre ce qui s'est passé. 

    Voici le code:

    int main()
    {
        char mot[]="marron";
        char mot_hidden[]= "******";
        char lettre;
        int nombre;
    
        int nb_vie = 10;
        int i=0;
        int vie_bool = 0;
    
    
        while (nb_vie>0){
        printf("Hidden Word: %s\n", mot_hidden);
        printf("Essayez une lettre, il vous reste %d vies:...\n", nb_vie);
        scanf("%c", &lettre);
        
    
        i = 0;
            while(i<6){
            //printf("test boucle\n");
            if(lettre==mot[i]){
                //printf("test boucle if\n");
                mot_hidden[i]=lettre;
                vie_bool++;
                }
            i++;
    
            }
        if(vie_bool == 0){nb_vie = nb_vie -1;}
        vie_bool = 0;
    
        }
        printf("%s\n",mot);
        return 0;
    }
    

    En gros la scanf lettre était ignoré une fois sur deux. En ajoutant la ligne while(getchar() != '\n'); juste après le problème eu été résolu mais je ne comprend pas du tout ce que fait l'instruction exactement.

    • Partager sur Facebook
    • Partager sur Twitter
      21 mai 2017 à 21:30:34

      Bonjour,

      Lorsque tu tapes au clavier, chaque caractère est écrit dans le buffer. C'est dans ce buffer que scanf ira lire. Tout ce qui n'est pas lu, sera lu au prochain appel de la fonction scanf.

      Par exemple, quand tu écris: une lettre puis touche entrée, dans le buffer, il y aura la "lettre - \n". Scanf lira la lettre, et il restera \n.

      while(getchar() != '\n'); sert à vider le buffer.

      En général, on utilise la célèbre fonction suivante:

      void viderBuffer()
      {
          int c = 0;
          while (c != '\n' && c != EOF)
          {
              c = getchar();
          }
      }

      ou plus court et identique:

      int c;
      
      while ((c = getchar ()) != '\n' && c != EOF);



      https://openclassrooms.com/courses/la-saisie-securisee-avec-scanf#/id/r-1228162

      -
      Edité par cauld 21 mai 2017 à 21:35:08

      • Partager sur Facebook
      • Partager sur Twitter
        21 mai 2017 à 21:39:01

        Salut,

        Sans rapport avec la question initiale, indentes mieux ton code et utilise int main(void) (int main() n’est pas une forme valide de main).

        • Partager sur Facebook
        • Partager sur Twitter
        Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs

        Boucle saute la scanf une fois sur deux

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown