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 si une chaine est un nombre


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Points : 35
    Points
    35
    Par défaut Tester si une chaine est un nombre
    Bonjour,

    J'ai une chaine de caractere dont je dois savoir si il s'agit d'une valeur numerique pour dans ce cas là la convertir en entier.
    Y a-t-il un moyen simple de tester une chaine pour savoir cela (j'avoues ne pas etre tres familer avec les manipulations de chaines en C), ou alors pas le choix et faut comparer chaque caractere un par un.

    Merci pour votre aide

  2. #2
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    recherche des infos sur la fonction atoi

  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
    Citation Envoyé par karl2mil1
    recherche des infos sur la fonction atoi
    Non, cette fonction est desormais depreciee.
    Il faut utiliser strtol() en verifiant que le deuxieme argument pointe bien vers '\0' apres la conversion. S'il ne pointe pas vers '\0', c'est que la conversion a echouee -> la chaine ne contenait pas que des chiffres.

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

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

    Citation Envoyé par Grimdol
    Bonjour,

    J'ai une chaine de caractere dont je dois savoir si il s'agit d'une valeur numerique pour dans ce cas là la convertir en entier.
    Y a-t-il un moyen simple de tester une chaine pour savoir cela (j'avoues ne pas etre tres familer avec les manipulations de chaines en C), ou alors pas le choix et faut comparer chaque caractere un par un.

    Merci pour votre aide
    Regarde les fonctions strto* (strtod(), strtof(), strtol(), strtoul() (+ fonctions long double et long longg) ) de <stdlib.h>). Elles offrent beaucoup plus de contrôle que des fonctions comme atoi(), atol(), atof() et atod() si une conversion échoue.

    Cela dépend de ce que tu veux déterminer comme valeur numérique, si elle est entière ou flottante. Il faut être plus précis.

    sscanf() peut aussi être utile dans le cas de valeurs formatées.

    A+

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Points : 35
    Points
    35
    Par défaut
    Ok, merci

    Je connaissais atoi (mais vu que ça ne renvoit pas d'erreurs) mais pas strtol. Lacunes maintenant corrigée.

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

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

    Citation Envoyé par DaZumba
    Non, cette fonction est desormais depreciee.
    atoi() n'est pas une fonction depreciee mais déconseillée d'usage. Elle offre simplement moins de contrôle sur la gestion d'erreur car elle n'est pas dans l'obligation de positioner errno (contrairement à strtol() par exple) et ne permet pas de récupérer la portion de chaine non convertie en cas d'échec, étant équivalente à (int)strtol(nptr, (char **)NULL, 10).

    A+

  7. #7
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut
    Sinon tu prends ta chaine et tu teste si chaque caractere est comprit dans le code ascii du 0 au 9. Je vais prendre un exemple. Admettons que ta chaine soit:
    "123456" et est contenu dans une variable char chaine[10];(la chaine peut etre plus grande il y a pas de soucis)
    Il te suffit de faire une fonction:
    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
     
    #include <stdio.h>
    #include <string.h>
     
    int test_nombre(char *chaine)
    {
        int longueur_chaine=0;
        int i;
        int nb_chiffres=0;
     
        longueur_chaine=strlen(chaine);//On stocke la longueur de la chaine
     
        for(i=0;i<longueur_chaine;i++)
        {
             //On regarde si chaque caractere est un nombre(48 est le code ascii //de 0 et 57 le code ascii de 9)
             if((chaine[i]>=48)&&(chaine[i]<=57))
             {
                  nb_chiffres++;//Si ce caractere est un nombre on incremente //nb_chiffres de 1 qui donne nombre de caracteres qui sont des chiffres
             }
        }
     
        //Si la longueur de la chaine est egale au nombres de caracteres qui sont //des chiffres alors toute la chaine contient des chiffres.
        if(nb_chiffres==longueur_chaine)
        {
            return 1;
        }
     
        //Si il y a au moins une lettre on retourne 0
        return 0;
    }

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Citation Envoyé par drcd
    Sinon tu prends ta chaine et tu teste si chaque caractere est comprit dans le code ascii du 0 au 9. Je vais prendre un exemple. Admettons que ta chaine soit:
    "123456" et est contenu dans une variable char chaine[10];(la chaine peut etre plus grande il y a pas de soucis)
    Il te suffit de faire une fonction:
    Hopala, pas si simple que cela. Quelques questions en vrac :

    Et si c'est une valeur flottante ?
    Comment vas-tu gérer le débordement des valeurs maximales autorisées par le type de la variable de destination ?
    Et si j'ai envie d'écrire 1.25e-4 ou -5 ou 0xFFE2 ?

    Citation Envoyé par drcd
    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
     
    #include <stdio.h>
    #include <string.h>
     
    int test_nombre(char *chaine)
    {
        int longueur_chaine=0;
        int i;
        int nb_chiffres=0;
     
        longueur_chaine=strlen(chaine);//On stocke la longueur de la chaine
     
        for(i=0;i<longueur_chaine;i++)
        {
             //On regarde si chaque caractere est un nombre(48 est le code ascii //de 0 et 57 le code ascii de 9)
             if((chaine[i]>=48)&&(chaine[i]<=57))
             {
                  nb_chiffres++;//Si ce caractere est un nombre on incremente //nb_chiffres de 1 qui donne nombre de caracteres qui sont des chiffres
             }
        }
     
        //Si la longueur de la chaine est egale au nombres de caracteres qui sont //des chiffres alors toute la chaine contient des chiffres.
        if(nb_chiffres==longueur_chaine)
        {
            return 1;
        }
     
        //Si il y a au moins une lettre on retourne 0
        return 0;
    }
    Quelques remarques :

    OK, pour un nombre entier positif sans indication de signe, mais ca ne veut pas dire que la chaine représente un entier valide entre INT_MIN et INT_MAX par exemple si c'est pour après faire rentrer le tout dans un int.

    Attention au strlen() si la chaine en entree n'est pas valide (pointeur nul).

    Tu peux simplifier (chaine[i]>=48)&&(chaine[i]<=57)) par (chaine[i]>= '0' && chaine[i]<= '9') ou mieux, utiliser isdigit() de <ctype.h> => if ( isdigit(chaine[i]) ).

    A+

  9. #9
    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 : 40
    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 Foobar1329
    OK, pour un nombre entier positif
    Même pour ça c'est pas ok :
    Citation Envoyé par drcd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((chaine[i]>=48)&&(chaine[i]<=57))
    Citation Envoyé par Foobar1329
    Tu peux simplifier (chaine[i]>=48)&&(chaine[i]<=57)) par (chaine[i]>= '0' && chaine[i]<= '9')
    Et si les entiers ne sont pas stockés dans l'ordre dans la table des caractères ?
    Citation Envoyé par Foobar1329
    ou mieux, utiliser isdigit() de <ctype.h> => if ( isdigit(chaine[i]) ).


    Et concernant atoi si ma mémoire est bonne cette fonction a été gardée pour assurer la compatibilité des anciens codes.

    Citation Envoyé par DaZumba
    depreciee
    Et c'est quoi cette francisation de deprecated ça sonne mal, obsolète c'est pas mieux

  10. #10
    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
    Et c'est quoi cette francisation de deprecated ça sonne mal, obsolète c'est pas mieux
    ??? Deprecier, c'est un verbe francais. Cela signifie 'perdre de sa valeur', ou 'dont la valeur a ete abaissee'. Ce qui correspond assez bien a l'usage anglais de to deprecate (belittle, disparage, express disapproval of)... Un redacteur de Developpez qui est court en vocabulaire ?

  11. #11
    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 : 40
    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
    ??? Deprecier, c'est un verbe francais. Cela signifie 'perdre de sa valeur', ou 'dont la valeur a ete abaissee'. Ce qui correspond assez bien a l'usage anglais de to deprecate (belittle, disparage, express disapproval of)...
    Effectivement : déprécier. Google n'est même pas capable de me sortir sa définition
    Mais je trouve le terme obsolète plus approprié (mais absent du dictionnaire de l'académie française ):
    Citation Envoyé par define: obsolète
    qui n'est plus d'actualité. Une information est dite obsolète lorsqu'elle est périmée.

    Citation Envoyé par DaZumba
    Un redacteur de Developpez qui est court en vocabulaire ?
    Mais si je connais mais je pensais à une mauvaise traduction de deprecated (comme librairie)

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

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

    Citation Envoyé par gege2061
    Même pour ça c'est pas ok :
    Et si les entiers ne sont pas stockés dans l'ordre dans la table des caractères ?
    Ben... Je ne connais pas de jeu de caractères dont les caractères tenant dans un char qui n'ont pas les caractères '0' à '9' non consécutifs. Si tu pensais à EBCDIC, ça marche aussi. J'ai eu un doute mais j'ai vérifié, ce sont les lettres qui ne sont pas consécutives dans EBCDIC .

    A+

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je crois avoir lu sur ce forum qu'il en existait un, mais qu'il n'était plus utilisé depuis... Je ne saurais dire quand, ni même si des machines supportant cela existent encore...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  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 : 40
    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 Foobar1329
    Ben... Je ne connais pas de jeu de caractères dont les caractères tenant dans un char qui n'ont pas les caractères '0' à '9' non consécutifs. Si tu pensais à EBCDIC, ça marche aussi. J'ai eu un doute mais j'ai vérifié, ce sont les lettres qui ne sont pas consécutives dans EBCDIC .
    Je n'en connait pas mais un jour j'inventerai un système où tous les comportements indéfinis du C entrainerons un reformatage complet du PC

  15. #15
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Points : 65
    Points
    65
    Par défaut
    Sinon méthode du boeuf.

    tu fais une boucle for ou Do/While comme tu veux
    int i=0;

    do
    {
    /*comparaison du premier caractère avec i*/
    i++
    }
    while(i=9);

    ou

    for(i=0; i<10; i++)
    {
    /*comparaison du premier caractère avec i*/
    }

    Voila la méthode du boeuf

  16. #16
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par orj30754
    Sinon méthode du boeuf.

    tu fais une boucle for ou Do/While comme tu veux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int i=0;
    do
    {
        /*comparaison du premier caractère avec i*/
        i++
    }
    while(i=9);
    Voila la méthode du boeuf
    En effet, c'est vraiment la méthode du boeuf....
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

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

Discussions similaires

  1. Tester si une chaine est un nombre
    Par Tenza06 dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 15/12/2008, 11h32
  2. Tester si une chaine est encodée en base64
    Par elitemedia dans le forum Langage
    Réponses: 2
    Dernier message: 20/06/2007, 21h51
  3. Tester si une chaine est un entier
    Par Tomimie dans le forum Delphi
    Réponses: 2
    Dernier message: 11/05/2007, 23h42
  4. [SQL] Tester si une chaine est au format date standard
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 5
    Dernier message: 18/07/2006, 14h00
  5. [langage] Comment tester si une chaine est vide
    Par |Bio dans le forum Langage
    Réponses: 4
    Dernier message: 04/05/2005, 15h05

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