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 :

vérifier si une chaîne est un nombre


Sujet :

C

  1. #1
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut vérifier si une chaîne est un nombre
    Bonjour tous le monde,

    dans mon code j'ai une vérification sur une chaîne de caractère si elle présente un nombre, j'utilise alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    if( !atoi(chaine) )
    {
     
    ....
     
    }
    Est ce qu'il y a d'autre moyen ????

  2. #2
    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
    atoi() est vraiment basique au niveau traitement d'erreur. De plus, 0 est un nombre.
    Tu as deux solutions:
    • boucler sur tous les caracteres de la chaine et verifier que isdigit() renvoit une valeur non nulle pour chacun;
    • utiliser strtol() en verifiant que la conversion s'est arretee au '\0' final.

  3. #3
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Une mise en oeuvre possible serait de voir si chaque caractère de la chaîne à tester se situe dans la fourchette '0' à '9'. Si ce n'est pas le cas, la chaîne n'est pas un nombre.

    Code c : 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define FALSE 0
    #define TRUE 1
     
    int main(int argc, char *argv[])
    {
        size_t len;
        unsigned int i;
        int valid = TRUE;
        char c;
     
        if(argc == 2)
        {
            len = strlen(argv[1]);
     
            for(i = 0; i < len; i++)
            {
                c = argv[1][i];
     
                if ((c < '0') || (c > '9'))
                {
                    valid = FALSE;
                    break;
                }
            }
     
            if(valid == FALSE)
                printf("La chaine n'est pas un nombre entier.\n");
            else
                printf("La chaine est nombre entier.\n");
        }
        else
            printf("Veuillez passer une chaine en argument du programme.");
     
        return EXIT_SUCCESS;
    }

    Le problème c'est que c'est assez dépendant du jeu de caractère. Cela implique que les caractère '0' à '9' se suivent et sont bien dans l'ordre croissant.

    On pourrait tester la présence d'un signe ('+' ou '-') en début de chaîne et la présence d'une unique virgule (ou plutôt le point décimal '.') dans la chaîne pour les nombres flottants.

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 40
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par Neitsa Voir le message
    Une mise en oeuvre possible serait de voir si chaque caractère de la chaîne à tester se situe dans la fourchette '0' à '9'.
    La fonction isdigit() le permet!!
    la syntaxe: isdigit(nom de la chaine[position du caractère]); Renvoi 0 si le caractère n'est pas numérique.

    quant à la fonction atoi() elle pemet de Convertir une chaine représentant une valeur numérique en (type int), mais ne vérifie pas si une chaîne de caractère présente un nombre.

  5. #5
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut
    Citation Envoyé par smpinf Voir le message
    La fonction isdigit() le permet!!
    la syntaxe: isdigit(nom de la chaine[position du caractère]); Renvoi 0 si le caractère n'est pas numérique.

    quant à la fonction atoi() elle pemet de Convertir une chaine représentant une valeur numérique en (type int), mais ne vérifie pas si une chaîne de caractère présente un nombre.
    Oui, mais on peut l'utiliser pour vérifier si la chiane est vraiment un nombre, par la valeur de retour qu'elle renvoie.

    En tous cas merci pour l'aide, c'était vraiment outils !!!

  6. #6
    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 cmoibal Voir le message
    Oui, mais on peut l'utiliser pour vérifier si la chiane est vraiment un nombre, par la valeur de retour qu'elle renvoie.
    Ben non justement, c'est bien le probleme de atoi(). La valeur de retour de atoi() ne prevoit pas de cas d'erreur.

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    il n'y a vraiment que 2 manières :

    • soit passer à travers chaque caractère, et vérifier qu'il est un chiffre, ou +, ou -, ou .
    • soit faire un sscanf ( chaine, "%f", &nombrefloat) et vérifier si le statut est égal à 1

  8. #8
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut
    Citation Envoyé par DaZumba Voir le message
    Ben non justement, c'est bien le probleme de atoi(). La valeur de retour de atoi() ne prevoit pas de cas d'erreur.
    oui c'est vrais, et ceci d'aprés les man pages de linux :
    The atoi() function converts the initial portion of the string pointed to by nptr to int. The behavior is the same as

    strtol(nptr, (char **) NULL, 10);

    except that atoi() does not detect errors.

    The atol() and atoll() functions behave the same as atoi(), except that they convert the initial portion of the string to their return type of
    long or long long. atoq() is an obsolete name for atoll().

  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
    Il faut savoir ce qu'on veut faire avec la chaine de caractere :
    • s'assurer qu'elle n'est compose que de chiffres, mais on ne souhaite pas convertir vers un entier ou un reel. Dans ce cas, une boucle avec isdigit() est la meilleure solution;
    • convertir la chaine de caractere en entier ou reel. Alors, strtol() et strtod() sont la solution (sscanf() dans une moindre mesure car elle ne retourne pas l'endroit ou la conversion a echoue, ce qui rend l'utilisation moins flexible - il y a des cas ou on sait que la conversion va echouer, genre "187abc" lorsqu'on veut convertir le premier chiffre puis se placer sur le 'a').

  10. #10
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    il n'y a vraiment que 2 manières :
    • soit passer à travers chaque caractère, et vérifier qu'il est un chiffre, ou +, ou -, ou .
    • soit faire un sscanf ( chaine, "%f", &nombrefloat) et vérifier si le statut est égal à 1
    vraiment merci, je serais mon souvenir !!!

  11. #11
    Membre averti Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Points : 441
    Points
    441
    Par défaut
    bon, juste pour rire, on peut faire :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(void) {
        char hihi[] = "12345", haha[100];
     
        sprintf(haha,"%d",atoi(hihi));
        if ( strcmp(haha,hihi) ) {
            printf("ce n'est pas un entier");
        } else {
            printf("c'est bien un entier");
        }
     
        return 0;
    }

  12. #12
    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 : 68
    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
    Citation Envoyé par cmoibal Voir le message
    dans mon code j'ai une vérification sur une chaîne de caractère si elle présente un nombre, j'utilise alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if( !atoi(chaine) )
    {
    ....
    }
    Est ce qu'il y a d'autre moyen ????
    Oui : utiliser strtol() qui remplace atoi() qui est obsolète (entre autre parce qu'on ne peut rien vérifier...).

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 740
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 740
    Points : 31 070
    Points
    31 070
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Neitsa Voir le message
    Le problème c'est que c'est assez dépendant du jeu de caractère. Cela implique que les caractère '0' à '9' se suivent et sont bien dans l'ordre croissant.
    C'est garantit par la norme. Mais bon, passer par "isdigit()" est quand-même plus propre car cela garantit la compatibilité ascendante

Discussions similaires

  1. Un petit défi : tester si une chaîne est un nombre romain
    Par rambc dans le forum Général Python
    Réponses: 1
    Dernier message: 09/04/2009, 13h43
  2. Vérifier qu'une chaîne n'est PAS un nombre
    Par foxbond dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 06/03/2009, 09h21
  3. Réponses: 10
    Dernier message: 21/11/2008, 11h20
  4. Voir si une chaîne est composée de nombre
    Par Destiny dans le forum C#
    Réponses: 2
    Dernier message: 26/04/2007, 10h56

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