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 :

Probleme avec un scanf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 256
    Par défaut Probleme avec un scanf
    Bonjour,

    J'ai un petit probleme que je ne sais pas résoudre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int test=0,i;
     
    while (test == 0){
    printf("Lecture : 1 \n Ecriture : 2 \n");
    scanf("%d",&i);
    if ((i == 1) || (i == 2))  test = 1 ;
    }
    tout se passe bien si j'appuie sur 1 ou 2 par contre si j'appuie sur une autre touche il y a un bug, en effet, par exemple si jappuie "J", j'ai mon printf qui s'affiche deux fois !

    Mon probleme vient du fait que la lors du scanf on appuie sur "J" puis entrée
    Alors le prochain printf prend la valeur "entrée" et passe toute seule!

    Comment puis résoudre ce probleme ?
    Je pense qu'il faut vider le buffer clavier mais je ne sais pas comment faire sans utiliser fflush.
    Merci

  2. #2
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par johnson95
    Comment puis résoudre ce probleme ?
    Je pense qu'il faut vider le buffer clavier mais ...
    Tout juste. Ajoutez ceci après scanf():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while ((c=getchar())!=EOF && c!='\n');
    /*c doit être de type int*/

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par johnson95
    Mon probleme vient du fait que la lors du scanf on appuie sur "J" puis entrée
    Alors le prochain printf prend la valeur "entrée" et passe toute seule!

    Comment puis résoudre ce probleme ?
    Je pense qu'il faut vider le buffer clavier mais je ne sais pas comment faire sans utiliser fflush.
    Bah, je nai pas tout ces problèmes, car je n'utilise pas scanf(). Jamais.

    http://emmanuel-delahaye.developpez.com/inputs.htm

    Ensuite, pour les conversions, il y a sscanf(), strto{[u]l|d}(),

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 61
    Par défaut
    Regarde essaye, mais je suis pas 100% sur regarde.
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
    long test = 0;
    long i = 0;
     
     
     
     
     
     
    while (test == 0)
    {
    printf("Lecture : 1 \nEcriture : 2 \n");
    scanf("%ld", &i);
    if (i == 1 || i == 2)
     
    test = 1 ;
     
    printf("\nmaintenant test vaut %ld", test);
    }
     
    	return 0;
    }
    J'éspère que c'est ça si sa t'aide.

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par mitherkiller
    Regarde essaye, mais je suis pas 100% sur regarde.
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
    long test = 0;
    long i = 0;
     
     
     
     
     
     
    while (test == 0)
    {
    printf("Lecture : 1 \nEcriture : 2 \n");
    scanf("%ld", &i);
    if (i == 1 || i == 2)
     
    test = 1 ;
     
    printf("\nmaintenant test vaut %ld", test);
    }
     
    	return 0;
    }
    J'éspère que c'est ça si sa t'aide.
    Si déjà tu proposes un code, essaye au moins de le rendre un peu présentable, c'est mieux pour la lecture. Moi ce que je propose et comme d'autre te proposerons, n'utilise pas scanf mais fgets, c'est mieux !

    Si tu veux faire un menu, voici une solution avec fgets:
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
     
    /* Buffer de 5 char, a changer pour un plus grand au cas ou ! */
    #define BUFFER_SIZE 5
     
     
    static int choice_menu (void)
    {
       char buf [BUFFER_SIZE] = { 0 };
       int val = 0;
     
     
       printf ("Lecture : 1\nEcriture : 2\n");
       fflush (stdout);
     
     
       /* On recupere la saisie utilisateur : */
       if ((fgets (buf, BUFFER_SIZE, stdin)) != NULL)
       {
          /* Suppression du \n s'il y'a. */
          {
             char * p = NULL;
     
             if (buf != NULL)
             {
                p = strchr (buf, '\n');
     
                if (p != NULL)
                {
                   *p = 0;
                }
             }
          }
     
          val = strtol (buf, NULL, 10);
       }
     
     
       return val;
    }
     
     
    int main (void)
    {
       int val = 0;
     
     
       do
       {
          val = choice_menu ();
       }
       while (val != 1 && val != 2);
     
     
       return EXIT_SUCCESS;
    }
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Franck.H
    Si tu veux faire un menu, voici une solution avec fgets:
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    /* Buffer de 5 char, a changer pour un plus grand au cas ou ! */
    #define BUFFER_SIZE 5
     
    static int choice_menu (void)
    {
       char buf [BUFFER_SIZE] = { 0 };
       int val = 0;
     
       printf ("Lecture : 1\nEcriture : 2\n");
       fflush (stdout);
     
       /* On recupere la saisie utilisateur : */
       if ((fgets (buf, BUFFER_SIZE, stdin)) != NULL)
       {
          /* Suppression du \n s'il y'a. */
          {
             char * p = NULL;
     
             if (buf != NULL)
             {
                p = strchr (buf, '\n');
     
                if (p != NULL)
                {
                   *p = 0;
                }
             }
          }
     
          val = strtol (buf, NULL, 10);
       }
     
       return val;
    }
    Ici, il n'y a pas d'intérêt à supprimer le '\n', surtout que tu n'en profites pas pour vider le flux en cas de saturation (4 caractères, c'est vite fait), ni pour tester le 0 en fin de chaine après la conversion par strtol(). C'est un peu bancal tout ça...

    Il vaut se concentrer quelques heures à faire des fonctions de lecture de 1 caractère (pratique pour le menus) ou d'une valeur entière, une bonne fois pour toutes plutôt que de de compliquer inutilement.

    Le fflush(stdout) est inutile à mois que tu ais oublié un 'prompt' ...

Discussions similaires

  1. Probleme avec scanf et printf imbriqués
    Par nozgarde dans le forum C
    Réponses: 8
    Dernier message: 11/04/2008, 11h24
  2. problem avec scanf
    Par yous18 dans le forum Débuter
    Réponses: 5
    Dernier message: 14/09/2007, 03h24
  3. Probleme avec scanf
    Par LinuxUser dans le forum C
    Réponses: 3
    Dernier message: 17/05/2007, 14h18
  4. Probleme Avec Scanf Et Gets !
    Par A_B dans le forum C
    Réponses: 11
    Dernier message: 09/03/2007, 21h20
  5. [debutant] Probleme avec le scanf()
    Par mc_fly dans le forum C
    Réponses: 21
    Dernier message: 07/09/2006, 12h22

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