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 :

convertir en un nombre à partir de la ligne de commande.


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 124
    Points : 52
    Points
    52
    Par défaut convertir en un nombre à partir de la ligne de commande.
    Voilà. je suis sous RedHat 9 et voila mon probleme.

    j'apelle un programme avec ./prog 250

    Le probleme est que j'aimerait bien recuperer le 250 en entier. si c'en est un !
    et afficher un message d'erreur sinon. j'ai la foncton isdigit(),mais j'ai pas trop d'idée sur comment m'en servir, puisque il lui faut autre chose q'une chaine de caracteres en entrée

    et avec argv[ 1 ] ca me sort une chaine de caracteres. c'est surement tout con, mais toutes les fonctions de convertion ne veulent pas compiler chez moi. qqun aurait une solution ? merci d'avance.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    bonsoir,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int n;
    char *psz,
    int bOkDigit=1;
    psz=argv[1];
    for(n=0;bOkDigit && n<strlen(psz);n++)  bOkDigit=isidigit(*(psz+n));
    voila ça devrait suffire

  3. #3
    Membre expérimenté Avatar de alexrtz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 639
    Points : 1 359
    Points
    1 359
    Par défaut
    Salut,

    Tu peux regarder ici

    sscanf renvoie le nombre de conversions réussies.
    "Je suis incapable d'expliquer ce qui se passa ensuite : je lâchai quelque chose, quelque chose à quoi je m'agrippais depuis toujours sans m'en rendre compte. Je m'enfonçais dans une obscurité chaude, moelleuse et protectrice, tandis qu'un loup montait la garde par mes propres yeux."

  4. #4
    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: convertir en un nombre à partir de la ligne de commande.
    Citation Envoyé par Krispy
    et avec argv[ 1 ] ca me sort une chaine de caracteres. c'est surement tout con, mais toutes les fonctions de convertion ne veulent pas compiler chez moi. qqun aurait une solution ? merci d'avance.
    Peux-tu montrer le code qui ne fonctionne pas.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 124
    Points : 52
    Points
    52
    Par défaut
    voilà c que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int l;
    sscanf(argv[1],"%d",&l;
    if( (isdigit(l)==0) &&(l<0)
    {
    mavariable = l;
    }
    else
    {
    mavariable=0; // valeur par défaut
    }
    Le probleme de cet algo, c'est que si j'entre ./prog ert

    il me sort qe mavariable vaut 1123145 !!!!
    ce qui n'a aucun sens pour moi.

  6. #6
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    la FAQ est ton amie
    http://lfe.developpez.com/FAQ/C/?pag...RINGS_numtostr

    Sinon, tu as aussi strtol
    Citation Envoyé par man strtol
    NOM
    strtol - Convertir une chaîne en un entier long.

    SYNOPSIS
    #include <stdlib.h>

    long int strtol (const char *nptr, char **endptr, int base);

    DESCRIPTION
    La fonction strtol() convertit la chaîne nptr en un entier long en
    fonction de l'argument base, qui doit être dans l'intervalle 2 a 36
    (bornes comprises), ou avoir la valeur spéciale 0.

    La chaîne peut commencer par un nombre quelconque d'espaces ou de car-
    actères interprétés comme tels par isspace(3). Un signe éventuel `+'
    ou `-' peut suivre. Si base vaut 0 ou 16, la chaîne peut inclure un
    préfixe `0x' et le nombre sera interprété en base 16. Sinon, une base
    valant zéro est interprétée comme 10 (décimale) sauf si le caractère
    suivant est `0', auquel cas la base est 8 (octale).
    Le reste de la chaîne est converti en une valeur entière longue, en
    s'arrêtant au premier caractère qui ne soit pas un chiffre valide.
    Dans les bases supérieures a 10, la lettre `A' (majuscule ou minuscule)
    représente 10, `B' represente 11, et ainsi de suite jusqu'à `Z' repre-
    sentant 35.

    Si endptr n'est pas NULL, strtol() stocke l'adresse du premier car-
    actère invalide dans *endptr. S'il n'y avait aucun chiffre valide,
    strtol() stocke la valeur originale de nptr dans *endptr (et renvoie
    0). En particulier, si *nptr n'est pas `\0' et si **endptr vaut `\0'
    en retour, la chaîne entière est valide.
    VALEUR RENVOYÉE
    La fonction strtol() renvoie le résultat de la conversion, à moins
    qu'un débordement superieur (overflow) ou inférieur (underflow) se pro-
    duise. Si un dépassement inférieur se produit, strtol() renvoie
    LONG_MIN. Si un dépassement supérieur se produit, strtol() renvoie
    LONG_MAX. Dans les deux cas, errno contient le code d'erreur ERANGE.

    ERREURS
    ERANGE La chaîne n'était pas dans l'intervalle acceptable, la valeur a
    été arrondie.

  7. #7
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 135
    Points : 146
    Points
    146
    Par défaut
    je viens d'ecrire ce code
    si ca peut te servir..

    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
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
            int entier;
     
            if (argc == 2)
            {
                    if ((*argv[1] > 47) && (*argv[1] < 58))
                    {
                            entier = atoi(argv[1]);
                            printf("valeur entiere : %d", entier);
                    }
                    else printf("veuillez entrer un entier");
            }
            return 0;
    }

  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
    Citation Envoyé par Krispy
    voilà c que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int l;
    sscanf(argv[1],"%d",&l;
    if( (isdigit(l)==0) &&(l<0)
    {
    mavariable = l;
    }
    else
    {
    mavariable=0; // valeur par défaut
    }
    Le probleme de cet algo, c'est que si j'entre ./prog ert

    il me sort qe mavariable vaut 1123145 !!!!
    ce qui n'a aucun sens pour moi.
    Merci de poster du code complet et compilable:

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include <stdio.h>
    #include <ctype.h>
     
    int mavariable;
     
    int is_number (char const *s)
    {
       int ok = 1;
       char const *p;
     
       for (p = s; *p; p++)
       {
          if (!isdigit (*p))
          {
             ok = 0;
             break;
          }
       }
     
       return ok;
    }
     
    void appli (char const *snum)
    {
       if (is_number (snum))
       {
          int val;
          int ret = sscanf (snum, "%d", &val);
     
          if (ret == 1)
          {
             mavariable = val;
          }
          else
          {
             mavariable = 0;
          }
       }
       else
       {
          fprintf (stderr, "err parametre : '%s'\n", snum);
       }
    }
     
    int main (int argc, char *argv[])
    {
       if (argc >= 1)
       {
          appli (argv[1]);
     
          printf ("mavariable = %d\n", mavariable);
       }
       else
       {
          fprintf (stderr, "err parametres\n");
       }
       return 0;
    }
    Attention:
    • Cette globale est horrible
    • Ce code n'accepte que les entiers positifs de à INT_MAX
    Pas de Wi-Fi à la maison : CPL

  9. #9
    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
    Citation Envoyé par Willand
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <...>
                    if ((*argv[1] > 47) && (*argv[1] < 58))
    <...>
    C'est quoi ces valeurs magiques '47' et '58' ?
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 135
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    C'est quoi ces valeurs magiques '47' et '58' ?
    Ce sont les codes ascii entre lesquels sont compris '0' et '9'

  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
    Citation Envoyé par Willand
    Citation Envoyé par Emmanuel Delahaye
    C'est quoi ces valeurs magiques '47' et '58' ?
    Ce sont les codes ascii de entre lesquels sont compris '0' et '9'
    Alors pourquoi se restreindre à l'ASCII et rendre son code non portable, et ne pas mettre '0' et '9' ?

    De toutes façon, il est préférable d'utliser la fonction standard isdigit() comme l'avait suggeré Krispy.
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 135
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Alors pourquoi se restreindre à l'ASCII et rendre son code non portable, et ne pas mettre '0' et '9' ?
    ouais remarque j'aurais pu mettre :

    if ((*argv[1] > '/') && (*argv[1] < ':'))
    ou
    if ((*argv[1] >= '0') && (*argv[1] <= '9'))

    mais de toute facon ca revient au meme, ... non ?
    quel que soit la machine, le code ascii n'est pas le meme (pour des valeurs comprises entre 0 et 127) ?

  13. #13
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 135
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    De toutes façon, il est préférable d'utliser la fonction standard isdigit() comme l'avait suggeré Krispy.
    et pourquoi ?
    ce que j'ai fait revient au meme

    sans compter que si t'inseres ctype.h, le programme au final aura une taille plus importante...

  14. #14
    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
    Citation Envoyé par Willand
    ouais remarque j'aurais pu mettre :

    if ((*argv[1] > '/') && (*argv[1] < ':'))
    ou
    if ((*argv[1] >= '0') && (*argv[1] <= '9'))

    mais de toute facon ca revient au meme, ... non ?
    Non, car rien ne dit que '/' et '0' soient consécutifs. Par contre, la norme du C impose que les codes '0' à '9' soient consécutifs et croissants.
    quel que soit la machine, le code ascii n'est pas le meme ?
    Le code ASCII[1] est un code parmi d'autres. Il existe des machines dont le charset est EBCDIC.

    -------------------
    [1] c'est un acronyme, donc majuscules
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 135
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Il existe des machines dont le charset est EBCDIC.
    hein ?

    charset ?
    EBCDIC ?

  16. #16
    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
    Citation Envoyé par Willand
    Citation Envoyé par Emmanuel Delahaye
    De toutes façon, il est préférable d'utliser la fonction standard isdigit() comme l'avait suggeré Krispy.
    et pourquoi ?
    ce que j'ai fait revient au meme
    Non. Ton code n'est pas portable. L'hypothèse "Code ASCII" peut être fausse (sur mainframe IBM, notamment). L'avantage des fonctions (ou macros) de <ctype.h> est qu'elles prennent en compte les différents charset possibles
    sans compter que si t'inseres ctype.h, le programme au final aura une taille plus importante...
    Je ne vois pas pourquoi.... Et puis cet argument est loin d'être recevable. La portabilité (qui est un point fort du C) prime sur beaucoup de considérations plus ou moins douteuses.
    Pas de Wi-Fi à la maison : CPL

  17. #17
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 135
    Points : 146
    Points
    146
    Par défaut
    Ok.. merci pour tes explications

    pour ce qui est de l'EBCDIC j'ai vu la definition sur : http://www.linux-france.org/prj/jargonf/E/EBCDIC.html


  18. #18
    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
    Citation Envoyé par Willand
    Citation Envoyé par Emmanuel Delahaye
    Il existe des machines dont le charset est EBCDIC.
    hein ?

    charset ?
    EBCDIC ?
    • charset : ensemble des caractères et de leurs valeurs numériques correspondantes.
    • EBCDIC est le nom de l'ensemble de caractères utilisé sur les mainframes IBM. (faut que je traduise aussi 'mainframe' et IBM ? )
    Pas de Wi-Fi à la maison : CPL

  19. #19
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 135
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    • charset : ensemble des caractères et de leurs valeurs numériques correspondantes.
    • EBCDIC est le nom de l'ensemble de caractères utilisé sur les mainframes IBM. (faut que je traduise aussi 'mainframe' et IBM ? )
    merci

    non c'est bon pour mainframe : http://www.linux-france.org/prj/jargonf/M/mainframe.html

    et pour IBM je connais la société
    lol

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

Discussions similaires

  1. comment exécuter un script sql à partir de la ligne de commande
    Par feros2184 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/05/2009, 21h01
  2. [OpenOffice][Tableur] Macros Calc : lancement à partir d'une ligne de commande et passage d'arguments
    Par lizzy.stak dans le forum OpenOffice & LibreOffice
    Réponses: 1
    Dernier message: 11/05/2009, 16h13
  3. Compiler à partir de la ligne de commande
    Par mokh7 dans le forum Débuter
    Réponses: 6
    Dernier message: 02/06/2008, 19h06
  4. Comment executer un script SQL a partir de la ligne de commande ?
    Par lassaad83 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/08/2007, 11h13
  5. lancer une mdb a partir d'une ligne de commande
    Par dpie dans le forum Access
    Réponses: 5
    Dernier message: 30/11/2004, 15h01

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