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 :

fonction qui vérifie si une valeur est numérique?


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    Points : 29
    Points
    29
    Par défaut fonction qui vérifie si une valeur est numérique?
    Bonjour à tous,

    Est-ce qu'il existe une fonction qui teste un paramètre s'il est une valeur numérique ou non? Par exemple si je lui passe la valeur 10 ==> succès sinon elle affiche un message d'erreur.

    Merci à tous.

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

    Informations professionnelles :
    Activité : Étudiant

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

    Quel serait le paramètre de ta fonction ?
    Car il existe bien strtol(), qui convertit une chaîne en long :
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main (void)
    {
       char s[] = "201";
       char *p_conv = NULL;
       strtol (s, &p_conv, 10);
     
       if(p_conv != NULL)
       {
          if(*p_conv == 0)
          {
             printf("s peut etre converti en nombre\n");
          }
          else
          {
             printf("s ne peut pas etre converti en nombre\n");
          }
       }
       return 0;
    }
    Si tu veux tester un simple caractère, la fonction isdigit() suffit.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    en fait je dois passer un paramètre en ligne de commande a ma fonction (arg[0]) et ce paramètre doit impérativemen être une valeur numérique.

    J'ai trouvé la fonction isdigit() mais cette fonction opère uniquement sur un seul chiffre à la fois

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Points : 243
    Points
    243
    Par défaut
    Eh bien, sers-toi de strtol() comme dans mon exemple.
    C'est parfaitement adapté à ton cas.

    A noter que dans mon exemple, je ne l'ai pas fait, mais tu peux récupérer le long issu de la conversion. Il est retourné par la fonction.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    Points : 29
    Points
    29
    Par défaut
    lorsque j'utilise strtol() et si par exemple je passe en paramètre la valeur "toto", ça serait quoi le résultat? Il faut que dans ce cas un message d'erreur sera affiché

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Points : 243
    Points
    243
    Par défaut
    Citation Envoyé par ryadh.naouar
    lorsque j'utilise strtol() et si par exemple je passe en paramètre la valeur "toto", ça serait quoi le résultat? Il faut que dans ce cas un message d'erreur sera affiché
    Prends mon exemple et fais différents tests en changeant la chaîne s. (Essaie en mettant "1234" puis "toto").
    Ce code me semble tout de même assez clair.
    N'hésite pas à consulter la doc de strtol().

  7. #7
    Membre régulier Avatar de Beldom
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 63
    Points : 70
    Points
    70
    Par défaut
    Tu peux aussi coder une fonction toute simple :

    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
     
    int is_number(char *av)
    {
       int i;
     
    /* --- */
       char flg;
     
       flg = 0;
    /* --- */
     
        for (i = 0; av[i]; i++)
            {
               if (! (av[i] >= '0' && av[i] <= '9'))
                 return(write(1, "Nombre invalide !\n", 18), 1);
     
    /* --- */
               else if  (av[i] == ',')
                 flg++;
               if (flg == 2)
                 return(write(1, "Nombre invalide !\n", 18), 1);
    /* --- */
     
             }
         return (write(1, "Nombre invalide !\n", 18), 0);
    }
    Les parties entre /* --- */ servent à gérer les nombres à virgule.
    Vala, c'est une solution comme une autre.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    Points : 29
    Points
    29
    Par défaut
    D'accord je vous remercie. En effet strtol est efficace.

    Merci

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Points : 243
    Points
    243
    Par défaut
    Citation Envoyé par Beldom
    Tu peux aussi coder une fonction toute simple :

    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
     
    int is_number(char *av)
    {
       int i;
     
    /* --- */
       char flg;
     
       flg = 0;
    /* --- */
     
        for (i = 0; av[i]; i++)
            {
               if (! (av[i] >= '0' && av[i] <= '9'))
                 return(write(1, "Nombre invalide !\n", 18), 1);
     
    /* --- */
               else if  (av[i] == ',')
                 flg++;
               if (flg == 2)
                 return(write(1, "Nombre invalide !\n", 18), 1);
    /* --- */
     
             }
         return (write(1, "Nombre invalide !\n", 18), 0);
    }
    Les parties entre /* --- */ servent à gérer les nombres à virgule.
    Vala, c'est une solution comme une autre.
    Cette fonction est loin d'être simple et est horrible :
    • Usage de int au lieu de size_t pour parcourir le tableau.
    • En C, ce n'est pas une virgule qui sépare la partie entière de la partie décimale mais un point
    • Retours multiples, à éviter
    • Si j'envoie NULL en paramètre, que se passe-t-il ?


    Pourquoi vouloir faire compliqué quand on peut faire simple ?
    Il existe une fonction toute prête...

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Points : 243
    Points
    243
    Par défaut
    Citation Envoyé par ryadh.naouar
    D'accord je vous remercie. En effet strtol est efficace.

    Merci
    N'oublie pas de cliquer sur "Résolu" si ton problème l'est

  11. #11
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par odsen.s
    • Usage de int au lieu de size_t pour parcourir le tableau.
    • En C, ce n'est pas une virgule qui sépare la partie entière de la partie décimale mais un point
    • Retours multiples, à éviter
    • Si j'envoie NULL en paramètre, que se passe-t-il ?
    - Utilisation de write
    - Aucun test de retour de l'appel système write
    - Ne gère pas les séparations par des .
    - et bien crade

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    bah le plus simple is isdigit sur chaque caractère de la chaine ( + les signes + ou -, et .).

  13. #13
    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 : 67
    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 souviron34
    bah le plus simple is isdigit sur chaque caractère de la chaine ( + les signes + ou -, et .).
    Mais une vraie analyse est assez complexe et nécessite l'usage d'une FSM...

    Entier décimal : [+-]0-9[*]

    Réel : [+-]0-9[*][.,[0-9[*]]eE[[+-]0-9[*]]]

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    oui c'est vrai, mais je ne suis pas certain que la fonction citée strol ne génère pas de coredump si on lui rentre un mauvais caractère....

  15. #15
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par souviron34
    oui c'est vrai, mais je ne suis pas certain que la fonction citée strol ne génère pas de coredump si on lui rentre un mauvais caractère....

    long int strtol (const char *nptr, char **endptr, int base);

    Si endptr n'est pas NULL, strtol() stocke l'adresse du premier caractère invalide dans *endptr. S'il n'y avait aucun chiffre valide, strtol() stocke la valeur originale de nptr dans *endptr. (Donc, si *nptr n'est pas `\0' et si **endptr vaut `\0' en retour, la chaîne entière est valide.)
    Normalement, c'est son job de ne pas planter si la chaine est mauvaise. (évidemment, par chaine on entend quand même quelque chose qui fini par \0)

  16. #16
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    ok merci millie

  17. #17
    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 : 67
    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 souviron34
    oui c'est vrai, mais je ne suis pas certain que la fonction citée strol ne génère pas de coredump si on lui rentre un mauvais caractère....
    C'est dans la norme et c'est parfaitement défini. Les fonctions strto*() arrêtent l'analyse dès qu'un caractères n'est plus convertible. Le pointeur endptr pointe sur le premier caractère non converti.

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

Discussions similaires

  1. Macro qui vérifie qu'une valeur est dans une table
    Par Filippo dans le forum Macro
    Réponses: 2
    Dernier message: 23/11/2009, 09h57
  2. Réponses: 3
    Dernier message: 12/12/2008, 10h47
  3. fonction qui indique qu'une variable est d'un type entier
    Par piotrr dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 21/06/2007, 16h05
  4. Réponses: 2
    Dernier message: 06/04/2007, 13h31
  5. vérifier qu'une valeur est numérique
    Par kopofb dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/11/2005, 14h02

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