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 :

Saisie d'un caractere dans un menu Switch


Sujet :

C

  1. #1
    Membre confirmé Avatar de ikeaboy
    Inscrit en
    Novembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2004
    Messages : 114
    Par défaut Saisie d'un caractere dans un menu Switch
    Bonsoir,

    Par le biais d'un switch j'ai crée un menu dans un des cas on doit saisir un caractere, malgrès tout mes efforts j'ai un problème que je n'arrive pas à comprendre.

    J'ai besoin de mettre deux scanf pour pouvoir saisir ce caractere sinon le programme continue sans me laisser la possibilité de saisir ce caractere.

    Je n'arrive pas à voir d'ou vient le probleme... en temps normal un seul scanf est nécessaire...
    Voici le code

    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
    #include <stdio.h>
    #include <string.h>
     
    main(){
     
    	char car;
    	int j,fin=1,choix;
     
    	/*Menu principal du programme*/
    	do{
    	printf("******************** M E N U - PRINCIPAL ********************\n");
    	printf("** 1. SAISIR UN NOMBRE ENTIER.                             **\n");
    	printf("** 2. SAISIR UN CARACTERE.                                 **\n");
    	printf("** 3. QUITTER.						   **\n");
    	printf("**------------------ Faites votre choix -------------------**\n");
    	printf("*************************************************************\n");
    	scanf("%d",&choix);
     
    	switch(choix){
    	case 1 : printf("Saisie d un entier\n");
    		 printf ("Veuillez saisir un entier\n");
    		 scanf("%d",&j);
    		 printf("L entier est : %d\n",j);
    		 break;
     
    	case 2 : printf("Saisie d un caractere\n");
    		 printf ("Veuillez saisir un caractere\n");
    		 scanf("%c",&car);
    		 /****** PROBLEME ******/
    		 //Deuxieme scanf necessaire sinon il ne me laisse pas saisir le caractere
    		 scanf("%c",&car); 
    		 printf("Le caractere est : %c\n", car); 
    		 break;
     
    	case 3 : printf("Au revoir\n");
    		//La valeur de "fin" est bien modifiée ce qui permet de quitter le menu
    		fin=0;
    		break;
     
    	default: printf("Erreur de saisie-->Choix non valide!\n\a");
    	} //Fin du switch
     
    	} //Fin du do
     
    	//Tant que l'on reste dans les choix possible
    	while(fin!=0);
     
    }// Fin de la main
    Merci d'avance pour votre aide

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    C'est un probléme récurrent il s'agit du buffer de ton clavier qui contient encore quelque chose.

    Il faut donc le vider tu peux chercher dans la FAQ c'est indiqué comment faire.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 136
    Par défaut
    bonsoir

    le programme considère le caractère retour chariot (Touche entrée, code ascii = 10) que tu tappes après avoir choisis dans le menu l'option 2.

    pour vérifier ça ajoute la ligne suivante après la lecture du caractère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Le caractere est : %d\n", car);
    le code ascii 10 sera affiché

    pour ton code tu peux le laisser comme ça. Mais si tu trouve une meilleure solution montre là nous

    merci

  4. #4
    Membre confirmé Avatar de landryx
    Inscrit en
    Décembre 2006
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 145
    Par défaut
    salut

    en fait ça t'impose un deuxieme scanf a cause du retour chariot..pour eviter de le garder en mémoire tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    scanf("%d%*c",&j); 
    scanf("%c%*c",&car);
    j'espere que ça va t'aider..

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Salut,

    Il y a un autre problème qui apparaît avec ton menu. Si l'utilisateur moyen que je suis a la mauvaise idée de répondre à la première question en entrant un caractère non décimal, ton programme va entrer dans une boucle infinie. Une bonne méthode pour sécuriser les entrées utilsateurs consiste à saisir l'entrée dans un tampon à l'aide de la fonction fgets et de valider ensuite cette entrée à la main avant d'effectuer un quelconque traitement dessus. Dans ton cas particulier, il s'agit de vérifier que l'utilisateur a bien introduit un décimal entre 1 et 3. De cette manière, tu devrais parvenir à résoudre la plupart de tes problèmes.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Membre confirmé Avatar de landryx
    Inscrit en
    Décembre 2006
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 145
    Par défaut
    Citation Envoyé par ikeaboy
    Bonsoir,

    Par le biais d'un switch j'ai crée un menu dans un des cas on doit saisir un caractere, malgrès tout mes efforts j'ai un problème que je n'arrive pas à comprendre.

    J'ai besoin de mettre deux scanf pour pouvoir saisir ce caractere sinon le programme continue sans me laisser la possibilité de saisir ce caractere.

    Je n'arrive pas à voir d'ou vient le probleme... en temps normal un seul scanf est nécessaire...
    Voici le code

    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
    #include <stdio.h>
    #include <string.h>
     
    main(){
     
    	char car;
    	int j,fin=1,choix;
     
    	/*Menu principal du programme*/
    	do{
    	printf("******************** M E N U - PRINCIPAL ********************\n");
    	printf("** 1. SAISIR UN NOMBRE ENTIER.                             **\n");
    	printf("** 2. SAISIR UN CARACTERE.                                 **\n");
    	printf("** 3. QUITTER.						   **\n");
    	printf("**------------------ Faites votre choix -------------------**\n");
    	printf("*************************************************************\n");
    	scanf("%d",&choix);
     
    	switch(choix){
    	case 1 : printf("Saisie d un entier\n");
    		 printf ("Veuillez saisir un entier\n");
    		 scanf("%d",&j);
    		 printf("L entier est : %d\n",j);
    		 break;
     
    	case 2 : printf("Saisie d un caractere\n");
    		 printf ("Veuillez saisir un caractere\n");
    		 scanf("%c",&car);
    		 /****** PROBLEME ******/
    		 //Deuxieme scanf necessaire sinon il ne me laisse pas saisir le caractere
    		 scanf("%c",&car); 
    		 printf("Le caractere est : %c\n", car); 
    		 break;
     
    	case 3 : printf("Au revoir\n");
    		//La valeur de "fin" est bien modifiée ce qui permet de quitter le menu
    		fin=0;
    		break;
     
    	default: printf("Erreur de saisie-->Choix non valide!\n\a");
    	} //Fin du switch
     
    	} //Fin du do
     
    	//Tant que l'on reste dans les choix possible
    	while(fin!=0);
     
    }// Fin de la main
    Merci d'avance pour votre aide

    salut

    ça marche nickel pour avec ceci
    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
     
    scanf("%d%*c",&choix);   
        switch(choix)
        {  
                     case 1 : 
                          printf("Saisie d un entier\n"); 
                          printf ("Veuillez saisir un entier\n"); 
                          scanf("%d%*c",&j); 
                          printf("L entier est : %d\n",j); 
                          break;   
                     case 2 : 
                          printf("Saisie d un caractere\n"); 
                          printf ("Veuillez saisir un caractere\n"); 
                          scanf("%c%*c",&car); 
                          printf("Le caractere est : %c\n", car); 
                          break;   
                     case 3 : 
                          printf("Au revoir\n");
                          // la tu peux mettre un getchar ou un systempause ou sinon tu mets rien...
                          fin=0;
                          break;
                          //La valeur de "fin" est bien modifiée ce qui permet de quitter le menu  fin=0; break;//
                     default: 
                          printf("Erreur de saisie-->Choix non valide!\n\a"); 
     
        } //Fin du switch   
     
        } //Fin du do   
        //Tant que l'on reste dans les choix possible  
        while(fin!=0);
    Bon apres si tu veux tu corriges le bug signalé plus haut par Thierry

    +

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Pour faire bon usage de la fonction scanf, la lecture de ce tutoriel est un must: http://xrenault.developpez.com/tutoriels/c/scanf/

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    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 ikeaboy
    J'ai besoin de mettre deux scanf pour pouvoir saisir ce caractere sinon le programme continue sans me laisser la possibilité de saisir ce caractere.
    http://emmanuel-delahaye.developpez.com/inputs.htm

  9. #9
    Membre confirmé Avatar de ikeaboy
    Inscrit en
    Novembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2004
    Messages : 114
    Par défaut
    Excusez de ne pas avoir répondu avant.

    En tout cas merci beaucoup de m'aider! merci

    Je regarde tout ca et je vous tiens au courant

  10. #10
    Membre confirmé Avatar de ikeaboy
    Inscrit en
    Novembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2004
    Messages : 114
    Par défaut
    Finalement j'ai vidé le buffer du clavier et ca fonctionne bien . En utilisant l'aide de la FAQ http://c.developpez.com/faq/c/?page=...buffer_clavier

    J'avais également essayé la gestion du scanf comme vous me l'avez conseillé mais, meme si cela fonctionne bien sur le petite exemple, ca ne fonctionnait pas très bien sur mon gros programme...

    En tout cas merci beaucoup pour votre aide précieuse!

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

Discussions similaires

  1. [MySQL] Limitation de caractere dans un champ de saisie
    Par Invité dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/07/2009, 16h20
  2. Interdir saisie de tous les caracteres dans un Tedit
    Par fmr130 dans le forum C++Builder
    Réponses: 3
    Dernier message: 18/06/2009, 13h44
  3. problème de saisie dans un menu en mode console
    Par kromartien dans le forum Débuter
    Réponses: 2
    Dernier message: 27/01/2008, 16h52
  4. Problème de saisie dans un menu
    Par IDE dans le forum C
    Réponses: 7
    Dernier message: 09/04/2007, 18h47

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