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 :

Problème de choix


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2012
    Messages : 42
    Par défaut
    Salut à tous !

    Ce que je vous soumet comme problème est extrêmement idiot je le sais mais j'ai juste un peu de mal avec les chaines de caractères... Pour faire simple ce que je veux c'est dire :
    si OUI 'O' fait ça sinon NON 'N' fait cela. C'est juste ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char choix;
        printf("Voulez choisir un justificatif ? (O/N) : " );
        scanf("%s",choix);
        printf("Votre choix est : %s\n",choix); //Pour voir mon choix qui affiche bien
        if (choix == 'N'){
            printf("Choix NON.\n");
            //Juste un test mais y a des opérations ici 
        } else {
            printf("Choix OUI.\n");
            //et ici aussi
    }
    C'est banal comme problème, j'ai lu tout sur les chaines de caractères mais c'est assez intriguant....

    Et par la suite vérifier que l'utilisateur a bien saisi 'O' ou 'N'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    do {
           printf("Veuillez saisir 'O' ou 'N'.\n");
           scanf("%s",choix);
           printf("Vous avez saisi %s\n\n",choix);
           if (choix == 'N'){
               printf("Choix NON.\n");
               //Juste un test mais y a des opérations ici 
           } else {
               printf("Choix OUI.\n");
               //et ici aussi
        }while (choix != 'N' && choix != 'O');

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Justement ici il ne s'agit pas d'une chaine de caractères, mais d'un seul caractère. Vient donc le format qui va avec : %c et pas %s pour printf() et scanf().
    scanf() auquel on rajoutera un & devant choix.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2012
    Messages : 42
    Par défaut
    J'ai fait ce que tu m'as dit, enfin voila :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char choix;  
        printf("Voulez choisir un justificatif ? (O/N) : " );
        scanf("%c",&choix);
        getchar();
     
        if (choix == 'N'){
            printf("Choix NON.\n");
        } else {
            printf("Choix OUI.\n");
        }
    Il ne présente que le choix OUI, peu importe la lettre que je saisie

  4. #4
    Invité
    Invité(e)
    Par défaut
    Tapes-tu bien un 'N' majuscule ? Ton code est tout à fait juste en tout cas.

  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
    Il faut également être sûr qu'avant le scanf("%c",...), le buffer clavier soit vide (et ne contienne pas, par exemple, un '\n' restant d'une lecture précédente)

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2012
    Messages : 42
    Par défaut
    Citation Envoyé par diogene Voir le message
    Il faut également être sûr qu'avant le scanf("%c",...), le buffer clavier soit vide (et ne contienne pas, par exemple, un '\n' restant d'une lecture précédente)
    Merci beaucoup, justement je crois que c'est bien ça le problème.

    J'ai plusieurs procédures en fait et dans le main j'ai un switch()...case... qui exécute chaque procédure lorsqu'on la sélectionne au clavier.

    Le code est correct mais quand on l'exécute après un choix provenant du switch... case..., elle ne fonctionne pas.

    Comment libérer le buffer du clavier après la sélection de la procédure ???

    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
    do {
            printf("\n\n");
            printf("Faites votre choix : ");
            scanf("%d",&choix);
            switch(choix){
                case 1 : {
                    printf("Entrel'horaire de départ :\n");
                    printf("Lire h1 : ");
                    scanf("%d",&h1);
                    printf("Lire h2 : ");
                    scanf("%d",&h2);
                    printf("Lire m1 : ");
                    scanf("%d",&m1);
                    printf("Lire m2 : ");
                    scanf("%d",&m2);
                    dureevol1(h1,h2,m1,m2);
                    break;
                }
                case 3 : {
                    printf("Lire A : ");
                    scanf("%d",&a);
                    suitenombre(a);
                    break;
                }
                case 4 : {
                    printf("Lire A : ");
                    scanf("%d",&a);
                    tabcroissant(tab,a);
                    break;
                }
                case 5 : {
                    printf("Lire A : ");
                    scanf("%d",&a);
                    MaximumTab(tab,a);
                    break;
                }
                case 6 : {
                    machinesoud(); //Fonction contenant le code
                    break;
                    //En supposant que je dois libérer le buffer du clavier ici :)
                }
     
            }
        } while(choix != 0);
     
        return 0;
    }

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 399
    Par défaut
    Généralement, on fait une fonction comme ça, qui lit le reste de la ligne:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /*Returns 0 if OK, a negative value if EOF.*/
    int fpurge(FILE *f)
    {
    	int c;
    	while((c=fgetc(f))!=EOF && c!='\n')
    	{ }
    	return (c==EOF ? -1 : 0);
    }
    Pour nettoyer après un fgets(), on fait une fonction un peu plus compliquée qui fait à la fois le nettoyage du buffer clavier et la suppression du '\n' de la chaîne.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2012
    Messages : 42
    Par défaut
    Dans ce cas il s'agit d'un fichier ou la lecture d'un fichier...

    Mais j'aimerai juste effectuer un nettoyage du clavier avant la saisie d'un nouveau caractère dans le clavier...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    char choix;  
        printf("Voulez choisir un justificatif ? (O/N) : " );
        /***** Avant de saisir le caractère O ou N je 
          veux nettoyer le clavier.............. 
          C'est à dire une instruction pour vider 
          le buffer du clavier comme la suggérer diogene****/
        scanf("%c",&choix);
        getchar();
     
        if (choix == 'N'){
            printf("Choix NON.\n");
        } else {
            printf("Choix OUI.\n");
        }
    Merci bien !

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 399
    Par défaut
    Il suffit de lui passer stdin en paramètre.
    Code C : 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
    /*Returns 0 if OK, a negative value if EOF.*/
    int fpurge(FILE *f)
    {
    	int c;
    	while((c=fgetc(f))!=EOF && c!='\n')
    	{ }
    	return (c==EOF ? -1 : 0);
    }
     
    ...
     
    	char choix;  
    	printf("Voulez choisir un justificatif ? (O/N) : " );
    	scanf("%c",&choix);
    	fpurge(stdin);
     
    	if (choix == 'N' || choix == 'n'){
    		printf("Choix NON.\n");
    	} else {
    		printf("Choix OUI.\n");
    	}
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2012
    Messages : 42
    Par défaut
    MERCI MEDINOC C'est gentil...

  11. #11
    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
    J'utilise souvent le format "%*[^\n]%*c" qui permet de vider le buffer clavier du reste de la ligne tapée. Par exemple :
    associé parfois à l'entrée des données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%d%*[^\n]%*c", &i);
    Ou avec une définition de macro pour faire plus joli :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define PURGE "%*[^\n]%*c"
    scanf("%d" PURGE, &i);
    A noter que cette méthode, comme fpurge(), ne marche que si le buffer clavier n'est pas déjà vide.

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 399
    Par défaut
    Explication du format:
    • % introduit la première "variable"
    • * indique que ça ne correspond pas à un paramètre de la fonction (ça dit à la fonction de "sauter" le format)
    • [^\n] signifie "Chaîne de caractère acceptant tout sauf \n"
    • % introduit la seconde "variable"
    • * indique là encore qu'il faut lire sans tenter de mémoriser
    • c pour lire un caractère (puisque le format précédent était "tout sauf \n", ce caractère sera forcément \n).

    En gros, avec ce format la fonction scanf() va lire, et ignorer, tous les caractères jusqu'au prochain \n, puis le \n lui-même.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2012
    Messages : 42
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Explication du format:
    • % introduit la première "variable"
    • * indique que ça ne correspond pas à un paramètre de la fonction (ça dit à la fonction de "sauter" le format)
    • [^\n] signifie "Chaîne de caractère acceptant tout sauf \n"
    • % introduit la seconde "variable"
    • * indique là encore qu'il faut lire sans tenter de mémoriser
    • c pour lire un caractère (puisque le format précédent était "tout sauf \n", ce caractère sera forcément \n).

    En gros, avec ce format la fonction scanf() va lire, et ignorer, tous les caractères jusqu'au prochain \n, puis le \n lui-même.
    Merci surtout pour l'explication....

    Parce que j'étais complètement perdu quant à l'utilisation de tous ses caractères.

    le \n c'est quoi exactement? C'est le caractère de fin de chaines mais comment est ce qu'on le représente en programmation ? J'ai toujours un peu de mal à comprendre \n.

  14. #14
    Invité
    Invité(e)
    Par défaut
    '\n' est le caractère de fin de ligne, ou plus exactement dans ton cas, celui qui est inséré lorsque tu valides en appuyant sur "Entrée".

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

Discussions similaires

  1. Re problème de choix de livre
    Par Loack- dans le forum Contribuez
    Réponses: 8
    Dernier message: 02/12/2006, 19h21
  2. Problème de choix automatique
    Par -Space- dans le forum Access
    Réponses: 2
    Dernier message: 05/07/2006, 16h08
  3. Problème de choix
    Par Karim1971 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 13/05/2006, 00h47
  4. Problème de choix de page lors de l'impression
    Par Olaf MENJI dans le forum Windows
    Réponses: 2
    Dernier message: 22/11/2005, 11h51
  5. Problème de choix pour un graphique
    Par MeDioN dans le forum 2D
    Réponses: 2
    Dernier message: 10/10/2005, 11h11

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