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 :

Utilisation de scanf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 2
    Par défaut Utilisation de scanf
    Bonjour,
    Je voudrais demander à un utilisateur d'introduire un caractère. Voici ce que j'ai essayé avec un scanf :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
        char rep = 'o';
        int i = 0;
        while(rep == 'o')
        {
            i++;
            printf("%d  encore ? [o/n]", i);
            scanf("%c", &rep); // idem avec rep = getchar();
        }
        return 0;
    }
    Je constate que, à l'exécution, on passe systématiquement deux fois dans la boucle. On dirait que le 'enter' que j'ai pressé pour valider mon caractère est pris comme deuxième caractère.
    Avez-vous des suggestions?

  2. #2
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    J'ai réussi à le faire marcher en remplaçant le printf par un write et le scanf par un read, ce qui veut dire que le problème vient d'une de ses deux fonctions.

    je pense en effet qu'entre la bufferisation de printf et le flush de scanf, il doit se passer une embrouille.

    Toujours est-il que :
    -write avec n'importe quoi sauf read, ça marche pas.
    -read marche avec tout.
    -ensuite les combinaisons printf puts scanf fgets fgetc getchar et companie, marchais pas.

    Je pense que tu a raison sur le '\n' qui provoque un deuxième tour. Mais après je suis pas sur du pourquoi du comment.

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 2
    Par défaut
    Merci pour ta réponse.

    Ma solution provisoire est d'ajouter un getchar() après le scanf pour 'avaler' le '\n'.

  4. #4
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Voici une solution un peu plus propre. Mais ça reste du bricolage.
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
      char rep = 'o';
      int i = 0;
      while(1)
        {
          if (rep != '\n')
    	{
    	  i++;
    	  printf("%d  encore ? [o/n]", i);
    	}
          scanf("%c", &rep);
          if (rep != 'o' && rep != '\n')
    	break;
        }
      return 0;
    }
    Malheureusement je ne connais pas suffisamment le comportement de scanf pour expliquer ton problème.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Je constate que, à l'exécution, on passe systématiquement deux fois dans la boucle ....
    Si on entre autre chose que 'o', on sort immédiatement de la boucle
    Si on entre 'o', on refait la boucle (c'est normal) mais on n'attend pas d'interventions de l'utilisateur sur le deuxième scanf() et on sort toujours de la boucle. C'est effectivement à cause du '\n' en attente dans le buffer d'entrée et qui est lu par le deuxième scanf().

    Une possibilité, modifier le format du scanf() pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     scanf(" %c", &rep); // avec un blanc devant %

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2008
    Messages : 61
    Par défaut
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
     
     
        char c;
     
     
        do
        {
               printf("encore ? [o/n]\n");
        c = getchar();
        fflush(stdin);
     
        }     while(c == 'o'); 
        return 0;
    }
    voilà ca devrait marcher !

Discussions similaires

  1. Réponses: 10
    Dernier message: 22/10/2010, 18h37
  2. utilisation de scanf
    Par sitamob dans le forum C
    Réponses: 3
    Dernier message: 10/04/2009, 21h49
  3. [Débutant(e)] Comment utiliser Scanf.sscanf
    Par bumbolol dans le forum Caml
    Réponses: 2
    Dernier message: 02/02/2009, 16h04
  4. scanf : utilisation dans une boucle de saisie
    Par kromartien dans le forum Bibliothèque standard
    Réponses: 4
    Dernier message: 03/12/2007, 23h50
  5. comment utiliser scanf proprement
    Par Eusebius dans le forum C
    Réponses: 8
    Dernier message: 20/09/2006, 10h09

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