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

Bibliothèque standard C Discussion :

Fonctionnement de strtol


Sujet :

Bibliothèque standard C

  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 15
    Par défaut Fonctionnement de strtol
    Bonjour,

    J'ai un problème avec la fonction strtol. Je n'arrive pas à comprendre le fonctionnement du second argument.

    Pouvez-vous m'aider ?

    Voici le code :

    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 <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    main()
    {
       char *chaine = "0042380 70042395:70042408 70042420:70042428";
       long Nb;
       char *endptr = NULL;
       Nb = 1;
     
       {
          printf ("le nombre est : %s\n",chaine);
          Nb = strtol (chaine, endptr ,8); 
          printf ("NB : %l\n",Nb);
       } 
    }
    Merci

  2. #2
    Membre chevronné 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
    Par défaut
    From the manPage :

    If endptr is not NULL, strtol() stores the address of the first invalid character in *endptr. If there were no digits at all, strtol() stores
    the original value of nptr in *endptr (and returns 0). In particular, if *nptr is not ’\0’ but **endptr is ’\0’ on return, the entire string is
    valid.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 15
    Par défaut
    J'avais déjà lu le man. Mais mon petit programme ne fonctionne pas ? Je ne trouve pas mon erreur.

    Merci de votre aide.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Tu dois passer soit &endptr, soit NULL.
    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.

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    endptr est un pointeur detiné à pointer sur le caractère ayant povoqué l'arrêt du processus de conversion. strtol doit donc pouvoir modifier sa valeur, il faut donc lui passer son adresse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    n = strtol("1234", &endptr, BASE_10);
    Si tout se passe bien, endptr doit pointer sur le '\0', autrement dit *endptr == '\0'. Autrement un caractère invalide a été rencontré avant le '\0' et a stoppé le processus de conversion. Ce deuxième argument st facultatif (mais il est recommandé de l'utiliser), on peut mettre tout simplement NULL.

  6. #6
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 15
    Par défaut
    Merci pour cette aide, ça m'a permis d'avancer.

  7. #7
    Expert éminent
    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
    Par défaut
    Citation Envoyé par raphadw Voir le message
    Merci pour cette aide, ça m'a permis d'avancer.
    Si c'est résolu, tu sais où clicker...

  8. #8
    Expert éminent
    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
    Par défaut
    Citation Envoyé par raphadw Voir le message
    Voici le code :
    Purée, t'as pas peur de poster ça...
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:6: warning: return type defaults to `int'
    main.c:6: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:7: warning: initialization discards qualifiers from pointer target type
    main.c:14: warning: passing arg 2 of `strtol' from incompatible pointer type
    main.c:15: warning: unknown conversion type character 0xa in format
    main.c:15: warning: too many arguments for format
    main.c:17: warning: control reaches end of non-void function
    main.c:17:2: warning: no newline at end of file
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 5 seconds)
    0 errors, 8 warnings
    Ton code mis au point :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main (void)
    {
       char const *chaine = "0042380 70042395:70042408 70042420:70042428";
       long Nb;
       char *endptr = NULL;
     
       printf ("le nombre est : %s\n", chaine);
       Nb = strtol (chaine, &endptr, 10);
       printf ("NB : %ld\n", Nb);
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    le nombre est : 0042380 70042395:70042408 70042420:70042428
    NB : 42380
     
    Press ENTER to continue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/06/2003, 16h51
  2. Réponses: 5
    Dernier message: 14/05/2003, 14h51
  3. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 21h49
  4. Prb de fonctionnement dans SaveDialog avecInitialDir
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/12/2002, 21h46
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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