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 :

Test d'un caractére entré au clavier.


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Points : 36
    Points
    36
    Par défaut Test d'un caractére entré au clavier.
    Bonjour,
    j'ai écris un petit programme en C en suivant un tutoriel C. Mais j'ai un léger problème dans ce dernier concernant le test d'un caractère entré au clavier.

    Voila ce que je souhaites faire :
    1. - Récupérer le caractère rentré.
    2. - Vérifier que le caractère est parmi ceux acceptés
    3. - Si non, alors on recommence.


    Le code est :
    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
     
    etat_saisie = nOK;
    do {
         char saisie [20];
     
        printf("\n Voulez-vous rejouer ? (Oui (o) ou Non (n)) : ");
        fgets(saisie, sizeof saisie, stdin);
        ret = sscanf(saisie,"%c", &rejouer);
     
        if (ret != 1) {
           printf( "\n\t La valeur entree n'est pas une donne valide."
                    "\n\t Veuillez recommencer.\n");
         }
         else if (rejouer  != 'o'){
            printf( "\n\t La lettre entree n'est pas valide. Seul"
                      "\n\t o (pour oui) et n (pour non) sont valides\n");
          }
          else {
                    etat_saisie = OK;
          }
    }
    Sachant que etat_saisie est definit plus haut dans le fichier par un define (0 pour nOK et 1 pour OK).
    'rejouer' est de type char.

    Merci pour votre aide (ou pour tout autre commentaires sur le code).

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Points : 36
    Points
    36
    Par défaut
    Bon,
    alors j'ai quand même cherché de mon coté, et a priori, j'ai trouvé la solution. Alors voici :
    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
     
    etat_saisie = nOK;
            do {
                printf("\n Voulez-vous rejouer ? (Oui (o) ou Non (n)) : ");
                fgets(saisie, sizeof saisie, stdin);
     
                // On efface le caractere \n de la saisie
                char *p = strchr(saisie, '\n');
                if (p)
                    *p = 0;
     
                // On teste la reponse
                /* valeur rentrée non-valide */
                if ((strncmp(saisie, reponse_oui, 3) != 0) && (strncmp(saisie, reponse_non, 3) != 0)){
                    printf( "\n\t La reponse n'est pas valide. Seul"
                            "\n\t oui et non sont valides\n");
                }
                /* valeur rentree est oui */
                else if (strncmp(saisie, reponse_oui, 3) == 0) {
                    printf("\n\n\t Une nouvelle partie va demarrer.\n\n");
                    etat_saisie = OK;
                    rejouer = OK;
                }
                /* valeur rentree est non */
                else if (strncmp(saisie, reponse_non, 3) == 0) {
                    printf("\n\n\t Fin de la partie.\n\n");
                    etat_saisie = OK;
                    rejouer = nOK;
                }
            }
            while (etat_saisie == nOK);

  3. #3
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par beware Voir le message
    Bon,
    alors j'ai quand même cherché de mon coté, et a priori, j'ai trouvé la solution. Alors voici :
    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
     
    etat_saisie = nOK;
            do {
                printf("\n Voulez-vous rejouer ? (Oui (o) ou Non (n)) : ");
                fgets(saisie, sizeof saisie, stdin);
     
                // On efface le caractere \n de la saisie
                char *p = strchr(saisie, '\n');
                if (p)
                    *p = 0;
     
                // On teste la reponse
                /* valeur rentrée non-valide */
                if ((strncmp(saisie, reponse_oui, 3) != 0) && (strncmp(saisie, reponse_non, 3) != 0)){
                    printf( "\n\t La reponse n'est pas valide. Seul"
                            "\n\t oui et non sont valides\n");
                }
                /* valeur rentree est oui */
                else if (strncmp(saisie, reponse_oui, 3) == 0) {
                    printf("\n\n\t Une nouvelle partie va demarrer.\n\n");
                    etat_saisie = OK;
                    rejouer = OK;
                }
                /* valeur rentree est non */
                else if (strncmp(saisie, reponse_non, 3) == 0) {
                    printf("\n\n\t Fin de la partie.\n\n");
                    etat_saisie = OK;
                    rejouer = nOK;
                }
            }
            while (etat_saisie == nOK);
    Ca me parait bien compliqué.

    On veut savoir si les caractères saisies sont 'o' ou 'n', c'est ça ? En cas d'erreur, on redemande la saisie ?

    Admettons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DO
      car := get_c()
    WHILE NOT car IN "on"
    ce qui donne en C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int car;
    do
    {
       char s[4];
       fgets(s, sizeof s, stdin);
       car = s[0];
    }
    while (strchr("on", car) == NULL);
    On peut agrémenter d'un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DO
      car := get_c()
      err := NOT car IN "on"
      IF err
       OUTPUT "erreur de saisie" EOL
      ENDIF
    WHILE err
    je te laisse coder ça en C...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Points : 36
    Points
    36
    Par défaut
    En fait, j'ai commis une erreur (enfin au moins, une), je n'ai pas changé le texte du message qui est désormais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("\n Voulez-vous rejouer ? (oui ou non) : ");
    Donc, je veux vérifier si l'utilisateur a entré 'oui' ou 'non'. C'est pourquoi, dans un premier temps, j'enlève le caractère '\n' dans la chaîne saisie.
    Puis je regarde si la reponse est oui ou non à l'aide de deux constantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const char *reponse_oui = "oui";
    const char *reponse_non = "non";
    et sinon je renvoie un message d'erreur.

    Comme tu l'as fait remarquer c'est peut être plus compliqué que cela ne devrait, mais c'est fait avec mes faibles connaissance du moment.

    Au final cela devient :
    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
     
    // Proposition de rejouer
            etat_saisie = nOK;
            do {
                printf("\n Voulez-vous rejouer ? (oui ou non) : ");
                fgets(saisie, sizeof saisie, stdin);
     
                // On efface le caractere \n de la saisie
                char *p = strchr(saisie, '\n');
                if (p)
                    *p = 0;
     
                // On teste la reponse
                /* valeur rentree est oui */
                if (strncmp(saisie, reponse_oui, 3) == 0) {
                    printf("\n\n\t Une nouvelle partie va demarrer.\n\n");
                    etat_saisie = OK;
                    rejouer = OK;
                }
                /* valeur rentree est non */
                else if (strncmp(saisie, reponse_non, 3) == 0) {
                    printf("\n\n\t Fin de la partie.\n\n");
                    etat_saisie = OK;
                    rejouer = nOK;
                }
                /* valeur rentrée non-valide */
                else {
                    printf( "\n\t La reponse n'est pas valide. Seul"
                            "\n\t oui et non sont valides\n");
                }
            }
            while (etat_saisie == nOK);

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Points : 83
    Points
    83
    Par défaut
    Tu le déclare comment ton "etat_saisie" ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Points : 36
    Points
    36
    Par défaut
    définit comme un entier qui peut prendre la valeur 0 ou 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int etat_saisie = nOK;
    selon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define OK  1
    #define nOK 0

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/12/2013, 20h03
  2. Réponses: 0
    Dernier message: 20/12/2011, 07h55
  3. lire les caractères entrés au clavier au fur et à mesure
    Par Decon dans le forum Général Java
    Réponses: 9
    Dernier message: 07/05/2010, 14h19
  4. Réponses: 2
    Dernier message: 17/10/2007, 14h15
  5. [Turbo Pascal] Entrée au clavier sous forme ******
    Par Upal dans le forum Turbo Pascal
    Réponses: 12
    Dernier message: 15/02/2003, 15h42

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