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 :

isdigit() renvoie toujours 0


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut isdigit() renvoie toujours 0
    Bonjour,

    J'ai besoin de tester le fait qu'un paramètre soit un nombre ou non. Pour ce faire, je pensais utiliser isdigit(), et ai donc écrit le programme de test suivant :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
     
    int main (void)
    {
        int i;
        char c;
     
        i=2;
        printf ("isdigit (%d) = %d\n", i, isdigit(i));
     
        i=10;
        printf ("isdigit (%d) = %d\n", i, isdigit (i));
     
        c='2';
        printf ("isdigit (%c) = %d\n", c, isdigit((int)c) );
        return EXIT_SUCCESS;
    }
    Mon problème survient lorsque j'exécute ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    heimdall> gcc -o test_isdigit -Wall -ansi -pedantic -O2 test_isdigit.c
    heimdall> ./test_isdigit
    isdigit (2) = 0
    isdigit (10) = 0
    isdigit (2) = 4
    Est-ce que quelqu'un pourrait
    • Soit m'expliquer le résultat
    • Soit me dire ce que je fais de mal ?

    Merci
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  2. #2
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par gangsoleil
    Bonjour,

    J'ai besoin de tester le fait qu'un paramètre soit un nombre ou non. Pour ce faire, je pensais utiliser isdigit(), et ai donc écrit le programme de test suivant :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
     
    int main (void)
    {
        int i;
        char c;
     
        i=2;
        printf ("isdigit (%d) = %d\n", i, isdigit(i));
     
        i=10;
        printf ("isdigit (%d) = %d\n", i, isdigit (i));
     
        c='2';
        printf ("isdigit (%c) = %d\n", c, isdigit((int)c) );
        return EXIT_SUCCESS;
    }
    Mon problème survient lorsque j'exécute ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    heimdall> gcc -o test_isdigit -Wall -ansi -pedantic -O2 test_isdigit.c
    heimdall> ./test_isdigit
    isdigit (2) = 0
    isdigit (10) = 0
    isdigit (2) = 4
    Est-ce que quelqu'un pourrait
    • Soit m'expliquer le résultat
    • Soit me dire ce que je fais de mal ?

    Merci
    Tout à fait normal, isdigit() prend bien un entier en paramètre mais travaille sur des valeurs entères correspondant à des caractères. Souvent, cela va correspondre à de l'encodage ASCII, donc '2' (50 en entier décimal en ASCII) va bien marcher, cela correspond à la valeur entière du caractère 2, par contre 2 va correspondre en ASCII au caractère de contrôle STX( Start Of Text), qui n'est pas un digit.

    A+

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bètement, je me réfère au man de isdigit() :

    int isdigit(int c);

    isdigit()
    Tests for any decimal-digit character.
    Dans la mesure où cette fonction attends un entier de type int, je me disais que le fait de lui passer un entier ne poserait pas de problèmes... D'où ma surprise !

    Existerait-il une autre fonction qui soit capable de faire ce que je veux ? strtol par exemple ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Citation Envoyé par gangsoleil

    Existerait-il une autre fonction qui soit capable de faire ce que je veux ? strtol par exemple ?
    Tout à fait.

    A+

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    isdigit renvoie 1 pour tous les nombres de 48 à 57.
    Le nombre 1 est représenté par une chaîne de caractères composée d'un seul chiffre '1' codé en ASCII par 49 en décimal et 0x31 en hexa.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    ok, merci pour ces précisions.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Trap D
    isdigit renvoie 1 pour tous les nombres de 48 à 57.
    Bzzt ! ASCII-only. Pour être portable on dit '0' - '9'...

  8. #8
    Membre expérimenté

    Étudiant
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut
    isdigit() permet de savoir si un caractère est un chiffre ou non


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int i;
     
    i=2;
    printf ("isdigit (%d) = %d\n", i, isdigit(i));
     
    i=10;
    printf ("isdigit (%d) = %d\n", i, isdigit (i));
    ca ce n'est pas juste puisque tu utilise un int.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char c;
     
    c='2';
    printf ("isdigit (%c) = %d\n", c, isdigit((int)c) );
    là c'est presque ca.

    il ne te faut pas convertir le char en int :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char c;
     
    c='2';
    printf ("isdigit (%c) = %d\n", c, isdigit(c) );
    voilà j'espère que ca t'aura aider.

  9. #9
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Pour mettre en évidence,

    Citation Envoyé par gangsoleil
    Bonjour,

    J'ai besoin de tester le fait qu'un paramètre soit un nombre ou non. Pour ce faire, je pensais utiliser isdigit(), et ai donc écrit le programme de test suivant :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
     
    int main (void)
    {
        int i;
        char c;
     
        i=2;
        printf ("isdigit (%d) = %d\n", i, isdigit(i));
     
        i=10;
        printf ("isdigit (%d) = %d\n", i, isdigit (i));
     
        c='2';
        printf ("isdigit (%c) = %d\n", c, isdigit((int)c) );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        /* Déclarer c en int plus haut */
        printf ("isdigit (%d) = %d\n", c, isdigit(c));
    Citation Envoyé par gangsoleil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
     return EXIT_SUCCESS;
    }
    Mon problème survient lorsque j'exécute ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    heimdall> gcc -o test_isdigit -Wall -ansi -pedantic -O2 test_isdigit.c
    heimdall> ./test_isdigit
    isdigit (2) = 0
    isdigit (10) = 0
    isdigit (2) = 4
    Est-ce que quelqu'un pourrait
    • Soit m'expliquer le résultat
    • Soit me dire ce que je fais de mal ?

    Merci
    Sinon, si il s'agit de vérifier qu'un paramètre que tu reçois sous forme de chaine de caractères est bien un nombre, oui, tu peux utiliser isdigit() sur chaque caractère de la chaine. Attention, ce travail n'est pas si simple.

    A+

  10. #10
    Expert éminent
    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
    Par défaut
    Citation Envoyé par gangsoleil
    J'ai besoin de tester le fait qu'un paramètre soit un nombre ou non. Pour ce faire, je pensais utiliser isdigit(), et ai donc écrit le programme de test suivant :
    relis la doc de la fonction. isdigit() permet de déterminer si un caractère est un chiffre ou non ('0'-'9').

  11. #11
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    On pourrait faire cela pour éviter d'utiliser isdigit():

    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
     
    Status 
    GetUInt32(UInt32 * val)
    {
      char sInput[64];
     
      if (NULL == fgets(sInput, 64, stdin)) {
        printf("\n Error! \n");
        return ERROR;
      }
     
      if (1 != sscanf(sInput, " %d", val)) {
        printf("\nInvalid input. Integer expected.\n\n");
        return ERROR;
      }
     
      return OK;
    }
    Puis appeller la fonction ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    UInt32 wdTimer;
     
      printf("Enter the time in second: \n");
      if (OK != GetUInt32(&wdTimer)){ 
        return (ERROR);
      }
    Qu'en pensez vous?

  12. #12
    Expert éminent
    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
    Par défaut
    Citation Envoyé par homeostasie
    On pourrait faire cela pour éviter d'utiliser isdigit():
    <...>
    Qu'en pensez vous?
    Moi, je ne pense plus, j'écris le test unitaire. Ca passe ou ça casse !

  13. #13
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Moi aussi j'en ai marre de penser, surtout un vendredi soir...

    En fait, la fonction isdigit() je la cerne mal. Elle demande un entier en paramètre mais pourtant apparemment il faut lui donner un char. Résultat j'ai un warning à la compilation et je trouve ca bizarre! Sourire

  14. #14
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par homeostasie
    Moi aussi j'en ai marre de penser, surtout un vendredi soir...

    En fait, la fonction isdigit() je la cerne mal. Elle demande un entier en paramètre mais pourtant apparemment il faut lui donner un char. Résultat j'ai un warning à la compilation et je trouve ca bizarre! Sourire
    Le type d'un caractère

  15. #15
    Expert éminent
    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
    Par défaut
    Citation Envoyé par homeostasie
    En fait, la fonction isdigit() je la cerne mal. Elle demande un entier en paramètre
    Non. elle demande un int. Nuance.
    mais pourtant apparemment il faut lui donner un char.
    Non. Elle demande un caractère. Or une constante caractère est de type int, et un char est promu en int. Donc aucun problème.
    Résultat j'ai un warning à la compilation et je trouve ca bizarre! Sourire
    What the fcuk ! Montre le code !

  16. #16
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Non. elle demande un int. Nuance.
    Ah bien, va falloir que je saississe bien la nuance, icar je pensais que int = integer = entier ;o).
    Pour moi un char est codé sur un octet alors qu'un entier est codé en pricnipe sur 4 octets.

    Gege, merci pour ce lien qui devrait m'aider; piur différencer notamment la différence entre C et C++ car j'ai fait esentiellement du C++.

    What the fcuk ! Montre le code !
    Ben là, je suis de retour chez moi donc n'est pas le code. En gros de tête, j'avais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    char Timer[sizeof(int)+1];
     
    ...
     
    while (Timer[i] != '\n'){
        if(isdigit(Timer[i]) == 0){
            return ERROR;
        }
        i++;
    }
    A la compilation, j'ai un warning qui me dit qu'apparemment il me faut un type integer. Enfin je crois que ca me dit, subscript integer...

    Sinon j'attendrais lundi pour te faire parvenir exactement. Je suis à l'apéro là.

    Bon we.

    Nicolas

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

Discussions similaires

  1. [JTextField] getText renvoie toujours la même valeur
    Par Sufflope dans le forum Composants
    Réponses: 4
    Dernier message: 13/01/2007, 01h12
  2. fopen renvoi toujours NULL
    Par kissmytoe dans le forum C
    Réponses: 6
    Dernier message: 01/11/2006, 20h01
  3. socket send renvoi toujours (-1)
    Par tkwebch dans le forum Réseau
    Réponses: 8
    Dernier message: 30/08/2006, 17h24
  4. [MySQL] Mon SELECT COUNT me renvoie toujours 1
    Par diaboloche dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 11/07/2006, 11h53
  5. Réponses: 2
    Dernier message: 16/04/2005, 20h24

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