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 :

Controle de saisie !


Sujet :

C

  1. #1
    A_B
    A_B est déconnecté
    Membre confirmé Avatar de A_B
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 153
    Par défaut Controle de saisie !
    Salut :
    Je travaille sur un programme qui comporte un menu de 1 a 5 (les choix) !
    Le probleme c'est que lorsque l'utilisateur saisie un choix invalide (un char au lieu de int ) par exemple le programme se bloque (boucle infini) alors je veut controler la saisie d'une façon simple et efficace !
    MERCI

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut

    Et tu utilises quoi pour lire le choix?

  3. #3
    A_B
    A_B est déconnecté
    Membre confirmé Avatar de A_B
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 153
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int choix;
    scanf("%d",&choix);

  4. #4
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Pour la boucle infinie c'est un probleme dans l'algo et on pourra pas t'aider sans le code ,)
    Une des choses à faire lorsqu'on fait des lectures sur l'entree standard est de nettoyer l'entrée standard apres lecture (voir FAQ)

  5. #5
    A_B
    A_B est déconnecté
    Membre confirmé Avatar de A_B
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 153
    Par défaut
    Vous m'avez mal compris :
    Le programme attend la saisie d'un entier, alors que l'utilisateur a saisie un caractere, il existe des fonctions de teste comme ISDIGIT ou ISALPHA ...etc..
    Mais ce que j'attend c'est la meilleur façon de les implementer car j'ai essayé mais ca ne donne pas grand chose ,..
    Par exemple ces fonctions de tests prennent comme parametre un CHAR alors j'ai declaré choix comme CHAR et non pas INT, apres le teste , si ça va et que choix est un INT comment je convertit un char en un int ..?

  6. #6
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Ah oui pardon
    Bein scanf() doit retourner une erreur indiquant que le format n'est pas valide (on a saisi un caractere au lieu d'un chiffre), mais je connais pas scanf.. alors man 3 scanf
    Cela dit, on est plutot partisans ici du couple fgets(buff, stdin) + strtoul() avec controle d'erreur suite à strtoul

  7. #7
    IDE
    IDE est déconnecté
    Membre éclairé Avatar de IDE
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 238
    Par défaut
    Bonjour, Voici un menu que j'ai réalisé avec l'aide de certaines personnes de ce site, si sa peut t'aider

    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
     
    tr_e Menu (void)
    {  
       int c;
       char buffer [4];                                      /* Déclaration d'un buffer temporaire */
     
       gotoxy (1, 7);
       printf ("\t\t1. Ajout d'une fiche\n"                  /* Affichage du menu à l'écran */
               "\t\t2. Chercher une fiche\n"
               "\t\t3. Afficher une fiche\n"
               "\t\t4. Suppression d'une fiche\n"
    	   "\t\t5. Quitter\n\n" "\t\tEntrez votre choix : "); 
     
      if ( fgets (buffer, sizeof buffer , stdin) != NULL )   /* Récupération de la saisie utilisateur donc stdin comme flux (dernier argument de fgets) */
        {
          c = (int) strtol (buffer, NULL, 10);               /* Conversion de la chaîne (buf) en entier */
        }
     
       return c;
     }

  8. #8
    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
    Personnellement, je n'utilise jamais scanf(). C'est possible de l'utiliser proprement, mais la tâche est ardue. Pour les entrées utilisateur, j'utilise des fonctions personnalisées à base de fgets(). Voici un exemple de fonction pour saisir un entier de manière sécurisée (J'espère qu'il n'y a pas d'erreur... je n'ai pas de compilo aujourd'hui sous la main pour tester):

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    enum IOErrors {
        IO_OK,
        IO_ERR_NULL_ARG,
        IO_ERR_INPUT,
        IO_ERR_FORMAT,
        IO_ERR_BUFFER,
        IO_ERR_UNKNOWN
    };
     
    int get_long(long *number);
     
    int main(void)
    {
        long choix = 0;
        int fin = 0;
        int err = IO_OK;
     
        do
        {
            printf("choisissez (1), (2) ou (3): ");
            fflush(stdout);
            err = get_long(&choix);
            if (choix >= 1 && choix <= 3)
            {
                fin = 1;
            }
        } while (err != IO_OK || fin != 1);
     
        printf("choix vaut %ld\n", choix);
     
        return EXIT_SUCCESS;
    }
     
    int get_long(long *number)
    {
        int err = IO_OK; 
     
        if (number != NULL)
        {
            char s_buffer[12] = {0};
     
            if (fgets(s_buffer, sizeof s_buffer, stdin) != NULL)
            {
                char *pc = strchr(s_buffer, '\n');
                if (pc != NULL) /* Saisie OK */
                {
                    long nb;
                    char *p_end = NULL;
     
                    /* On élimine le caractère de fin de ligne du tampon */
                    *pc = 0;
     
                    nb = strtol(s_buffer, &p_end, 0);
                    if (*p_end == 0)
                    {
                        /* Format de l'entrée utilisateur OK */
                        *number = nb;
                    }
                    else
                    {
                         /* Erreur dans le format de la saisie */
                         err = IO_ERR_FORMAT;
                    }
                }
                else
                {
                    /* L'entrée utilisateur a été tronquée: il faut vider le tampon */
                    int c;
                    while ((c = fgetc(stdin)) != '\n' && c != EOF)
                    {
                        /* On ignore les caractères */
                        continue;
                    }
                    err = IO_ERR_BUFFER;
                }
            }
            else
            {
                /* Erreur durant la saisie */
                err = IO_ERR_INPUT;
            }
        }
        else
        {
            /* Erreur d'argument: number ne doit pas être NULL */
            err = IO_ERR_NULL_ARG;
        }
        return err;
    }
    Pour réaliser une fois pour toute tes propres fonctions d'entrée/sortie sécurisées, voici un lien qui peut t'intéresser: http://emmanuel-delahaye.developpez.com/inputs.htm

    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++

    +

  9. #9
    A_B
    A_B est déconnecté
    Membre confirmé Avatar de A_B
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 153
    Par défaut
    OK !
    J'ai trouvé j'ai utilisé la fonction ATOI ça ressemble beaucoup a celle que vous m'avez filée !
    Plus de boucles infini mntnt !
    MERCI

  10. #10
    Membre éclairé
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Par défaut
    Salut,

    Attention, atoi est dépassée, on ne peut pas contrôler si la conversion est réussie ou non !
    Il faut utiliser strtol à la place.

  11. #11
    Membre éclairé Avatar de femtosa
    Inscrit en
    Juin 2002
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 253
    Par défaut
    Tiens de quoi te renseigner pour faire des fonctions de saisies correctes !

    Et n'oublie pas le tag

Discussions similaires

  1. Controle de saisie sur une liste déroulante
    Par antier dans le forum IHM
    Réponses: 3
    Dernier message: 07/12/2005, 05h42
  2. Controler une saisie
    Par philippef dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/08/2005, 10h36
  3. DBGrid personnalisé (controle de saisie numérique et date).
    Par abdelghani_k dans le forum Bases de données
    Réponses: 2
    Dernier message: 18/04/2005, 18h50
  4. ptit probleme de controle de saisie de formulaire
    Par coachbob44 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 24/03/2005, 14h09
  5. [LG]contrôle de saisie
    Par zetterberg_10 dans le forum Langage
    Réponses: 8
    Dernier message: 10/02/2005, 13h55

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