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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    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 é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,

    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
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    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 é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
    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
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    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 é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
    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 confirmé 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
    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
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    Par défaut
    D'accord je vous remercie. En effet strtol est efficace.

    Merci

  9. #9
    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
    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

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

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

+ 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