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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 averti
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Par défaut
    recherche des infos sur la fonction atoi

  3. #3
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    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
    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
    Par défaut
    Ok, merci

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

  5. #5
    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 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+

  6. #6
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    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 : 366
    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;
    }

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

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

  9. #9
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    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 ?

  10. #10
    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 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+

  11. #11
    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 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+

+ 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