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 :

tester que tous les caracteres d'un chaine sont des chiffres


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 103
    Points
    103
    Par défaut tester que tous les caracteres d'un chaine sont des chiffres
    bonjour,

    je cherche une methode simple pour faire ca.
    exemple:
    si on teste "124543" ca renvoie true
    si on teste "12ef34e" ca renvoie false
    je pensais tester les caracteres un par un, les convertir en chiffre, et verifier que le resultat est bien compris entre 0 et 9. mais si je converti une lettre en chiffre (fonction atoi()) j'obtiens 0, ca fausse ma methode.
    auriez vous une meilleure idee ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 103
    Points
    103
    Par défaut
    je precise que la chaine de caractere en question a tester a une longueur aleatoire. ca peut etre "12e" ou "12345" ou "12345rt23"

  3. #3
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Utilise la fonction isdigit(), declaree dans ctype.h. Tu testes chaque caractere, des que isdigit() renvoie faux, tu arretes et renvoies faux.

  4. #4
    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
    Points : 6 498
    Points
    6 498
    Par défaut
    Plutôt qu'utiliser atoi (qui est obsolète) utilise strtol:
    Citation Envoyé par MSDN
    long strtol( const char *nptr, char **endptr, int base );
    Parameters
    nptr
    Null-terminated string to convert
    endptr
    Pointer to character that stops scan
    base
    Number base to use
    Libraries
    All versions of the C run-time libraries.

    Return Value
    strtol returns the value represented in the string nptr, except when the representation would cause an overflow, in which case it returns LONG_MAX or LONG_MIN. strtol returns 0 if no conversion can be performed. wcstol returns values analogously to strtol. For both functions, errno is set to ERANGE if overflow or underflow occurs.
    En testant au sortir de la fonction le pointeur endptr tu peux savoir si ton mot a été entièrement transformé en nombre (endptr = nptr + strlen(nptr)) ou non.
    Un des intérêts est que si tu veux tester un nombre en hexa tu changes simplement la base de conversion.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 128
    Points : 151
    Points
    151
    Par défaut
    Tu peux aussi tester les codes ASCII. Il suffir de vérifier si le code de chacun de tes caractères est compris entre 48 (le '0') et 57 (le '9')

  6. #6
    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
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par Marcin
    Tu peux aussi tester les codes ASCII. Il suffir de vérifier si le code de chacun de tes caractères est compris entre 48 (le '0') et 57 (le '9')
    Non portable, ce ne sont pas les mêmes codes en EBCDIC, il faut utiliser la macro isdigit comme signalé plus haut.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 103
    Points
    103
    Par défaut
    ok, merci.

  8. #8
    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 Re: tester que tous les caracteres d'un chaine sont des chif
    Citation Envoyé par tatayoyo
    si on teste "124543" ca renvoie true
    si on teste "12ef34e" ca renvoie false
    strtol()
    sscanf()
    http://emmanuel-delahaye.developpez....tes.htm#saisie

    Fait de ton mieux et poste ton code si il ne fonctionne pas.

  9. #9
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut Re: tester que tous les caracteres d'un chaine sont des chif
    Citation Envoyé par Emmanuel Delahaye
    strtol()
    sscanf()
    Qu'est-ce que vous avez tous contre isdigit() ? Elle est ANSI-C, cette brave petite fonction, et le code devient evident:

    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
     
    int all_digits(const char *s)
    {
        const char *p = s;
     
        while(*p)
        {
           if(!isdigit(*p))
           {
             return 0;
           }
           p++;
        }
        return 1;
    }
    Evidemment, la fonction ci-dessus suppose que la chaine de caracteres s est NULL-terminated.

  10. #10
    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
    Points : 6 498
    Points
    6 498
    Par défaut
    DaZumba >> Je n'ai rien contre isdigit, j'ai simplement indiqué une autre possibilité, c'est tout

  11. #11
    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 Re: tester que tous les caracteres d'un chaine sont des chif
    Citation Envoyé par DaZumba
    Qu'est-ce que vous avez tous contre isdigit() ?
    Rien du tout. Déjà citée. (Omission ne veut pas dire opposition)

  12. #12
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut Re: tester que tous les caracteres d'un chaine sont des chif
    Citation Envoyé par Emmanuel Delahaye
    Omission ne veut pas dire opposition
    Joliment dit. C'est a croire que je deviens paranoiaque. Il va falloir que je corrige cela!

  13. #13
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut Re: tester que tous les caracteres d'un chaine sont des chif
    Citation Envoyé par DaZumba
    Joliment dit. C'est a croire que je deviens paranoiaque. Il va falloir que je corrige cela!
    C'est juste qu'on est habitué à ce qu'Emmanuel donne toutes les solutions

    Par contre, pour faire mon relou, il vaut mieux éviter plusieurs return dans une fonction même si dans ce cas précis, ça ne pause pas de problème.

    Nas'

  14. #14
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut Re: tester que tous les caracteres d'un chaine sont des chif
    Citation Envoyé par Nasky
    Par contre, pour faire mon relou, il vaut mieux éviter plusieurs return dans une fonction même si dans ce cas précis, ça ne pause pas de problème.
    Oui, on peut en effet respecter ce principe. Ca devient alors:

    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
     
    int all_digits(const char *s)
    {
        int ret = 1;
        const char *p = s;
     
        while(*p)
        {
           if(!isdigit(*p))
           {
             ret = 0;
             break;
           }
           p++;
        }
        return ret;
    }

  15. #15
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Pour faire encore mon relou, il vau mieux éviter l'utilisation de break
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int all_digits(const char *s)
    {
        int ret = 1;
        int i=0 ;
        const char *p = s;
     
        while(*p && isdigit(*p))
        {
           i++;
           p++;
        }
        if(i == strlen(s)) ret = 1 ; else ret = 0 ;
        return ret;
    }
    C'est moche je sais mais bon, c'était juste histoire de chipoter

    Nas'

  16. #16
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Nasky
    Pour faire encore mon relou, il vau mieux éviter l'utilisation de break
    Je m'y attendais... Dans ce cas, on va compresser tout ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int all_digits(const char *s)
    {
        const char *p = s;
     
        while(*p && isdigit(*p))
        {
           p++;
        }
        return *p == '\0';
    }

  17. #17
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Ah oui, pas mal l'astuce du return. Je n'y avais pas pensé
    Bon ba voilà, on a une jolie fonction maintenant

    Nas'

  18. #18
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Et maintenant rendons ça illisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int all_digits(const char *s){while(*s++&&isdigit(*s));return!*s;}
    Sans rire, les optimisations c'est bien mais il ne faut pas perdre la illisibilité surtout que le compilateur sais surement mieux le faire que vous!

    [edit]Encore un effort et on remporte l'IOCCC de cette année [/edit]

  19. #19
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par gege2061
    Sans rire, les optimisations c'est bien mais il ne faut pas perdre la illisibilité surtout que le compilateur sais surement mieux le faire que vous!
    On n'optimise rien, on voulait simplement:
    - un return unique
    - eviter un break qui etait, je l'admets, tout a fait inelegant

    Par contre, ton idee de te passer de la variable locale *p et boucler directement sur s est tres bonne ! Et je ne sais pas, mais je trouve cela lisible (d'autant que le nom de la fonction, avec eventuellement un petit commentaire, aide beaucoup a la comprehension).

  20. #20
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par DaZumba
    On n'optimise rien, on voulait simplement:
    - un return unique
    - eviter un break qui etait, je l'admets, tout a fait inelegant
    C'était un brin ironique, effectivement je n'ai rien à redire sur vos modifications, c'était juste pour vous prévenir de ne pas tomber dans l'extrème!
    Citation Envoyé par DaZumba
    Par contre, ton idee de te passer de la variable locale *p et boucler directement sur s est tres bonne !
    Merci
    Citation Envoyé par DaZumba
    Et je ne sais pas, mais je trouve cela lisible
    Peut être parce que tu as vu la version propre avant, ou l'expérience mais un débutant risque de s'amuser!
    Citation Envoyé par DaZumba
    avec eventuellement un petit commentaire
    Ah non l'une des premières règles, si tu veux faire tu code illisible c'est de ne pas mettre de commentaires (ou des commentaires qui servent à rien).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XMLUnit] Comment vérifier que tous les éléments d'une séquence sont présents
    Par Fifan31 dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 21/05/2013, 15h30
  2. Réponses: 2
    Dernier message: 23/01/2013, 12h16
  3. Réponses: 0
    Dernier message: 06/04/2012, 16h41
  4. Eclairer tous les espaces d'un chaine de caracteres
    Par mihaispr dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 04/03/2010, 11h19
  5. [langage] remplacer les caractères d'une chaine
    Par perlaud dans le forum Langage
    Réponses: 14
    Dernier message: 12/05/2004, 11h05

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