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 une chaine en un entier : strtol() ou atoi()


Sujet :

C

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Octobre 2005
    Messages : 141
    Points : 135
    Points
    135
    Par défaut Convertir une chaine en un entier : strtol() ou atoi()
    Bonjour

    Pratiquement tout est dans le titre.

    1. Je me demandais pourquoi atoi() était si désaprouvé d'utilisation par beaucoup d'entre vous, je l'utilise souvent après fgets et je n'ai aucun problème de bug.

    2. strtol() cela veut dire string to long ? Donc si c'est bien cela, un long et un int ne sont pas pareils, donc d'un côté on risque de créer des bugs non ?

    Voila, si quelqu'un veut bien m'éclairer sur ce point.
    Merci d'avance !

    Kr00pS

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Le probleme avec la fonction atoi c'est qu'elle ne permet pas de savoir si la chaine representait un nombre, ni si la chaine a pu entierement etre convertie. strtol resout ces problemes.

    Concernant le fait que strtol() retourne un long, il faut distinguer deux cas :
    * la chaine de caractere represente une valeur pouvant etre contenu par un int, dans ce cas le cast long vers int est pertinent et n'introduit pa de bug.
    * la chaine de caractere represente une valeur ne pouvant pas etre contenu dans un int, dans ce cas si tu stockes la valeur retournee par strtol() dans un int, cette valeur sera erroné, tout comme elle l'aurait ete avec l'utilisation de atoi().

  3. #3
    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 une chaine en un entier : strtol() ou atoi()
    Citation Envoyé par Kr00pS
    1. Je me demandais pourquoi atoi() était si désaprouvé d'utilisation par beaucoup d'entre vous, je l'utilise souvent après fgets et je n'ai aucun problème de bug.
    Que se passe-t-il en cas de dépassement de capacité ? Et si la chaine est invalide ?
    2. strtol() cela veut dire string to long ?
    Peut importe ce que ça semble vouloir dire (il y a des pièges). Ce qui compte, c'est la définition de la fonction telle qu'elle est décrite dans la norme.

    http://emmanuel-delahaye.developpez....ge=Page2#LVIII

    Oui, strtol() convertit une chaine représentant un nombre de base 2 à 36 en une valeur numérique de type long.
    Donc si c'est bien cela, un long et un int ne sont pas pareils, donc d'un côté on risque de créer des bugs non ?
    On peut, oui, si on cherche à faire entrer un long dans un int. En effet, la plage minimale garantie d'un int est de -32767 à + 32767

    http://emmanuel-delahaye.developpez....tique-c/#LIV-N

    En toute rigueur, on devrait donc écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <limits.h>
    ...
       int b;
       long a = strtol("123456", NULL, 10);
     
       if (a >= INT_MIN && a <= INT_MAX)
       {
          b = (int) a;
       }
       else
       {
          puts("too big for an int");
       }
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Octobre 2005
    Messages : 141
    Points : 135
    Points
    135
    Par défaut
    Merci beaucoup à vous deux.

    J'ai deux questions hors sujet :
    * Est-ce que le C99 est _mieux_ que le C89 ?
    * Je veux apprendre les prototypes des fonctions standard, pour cela je veux aussi imprimer cette liste mais encore faut-il l'avoir, donc je me demandais où puis-je avoir le draft standard ANSI de 1989 j'ai cherché sur google mais je ne trouve rien.

    Merci encore.

    Kr00pS

  5. #5
    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 Kr00pS
    J'ai deux questions hors sujet :
    C'est pas hors-sujet.
    * Est-ce que le C99 est _mieux_ que le C89 ?
    <TROLL=ON>
    Non !
    <TROLL=OFF>
    * Je veux apprendre les prototypes des fonctions standard, pour cela je veux aussi imprimer cette liste mais encore faut-il l'avoir, donc je me demandais où puis-je avoir le draft standard ANSI de 1989 j'ai cherché sur google mais je ne trouve rien.
    Je ne suis pas sûr qu'on puisse trouver les drafts de C89/C90 sur le net. Par contre, pour C90, il y a des sites de réferences comme :

    http://www-ccs.ucsd.edu/c/

    (lien donné sur la première page de mon site...)

    Sinon, tu fais comme tout le monde :

    google : man 3 <fonction>
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Octobre 2005
    Messages : 141
    Points : 135
    Points
    135
    Par défaut
    D'accord, merci.

    Pour la recherche des fonctions avec man 3, le 3 il cherche seulement les fonctions C89/90 ?

    J'ai déjà remarqué ça : VOIR AUSSI atof(3), atol(3), strtod(3), strtol(3), strtoul(3) et ça m'intrigue.

    Kr00pS

  7. #7
    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 Kr00pS
    Pour la recherche des fonctions avec man 3, le 3 il cherche seulement les fonctions C89/90 ?

    J'ai déjà remarqué ça : VOIR AUSSI atof(3), atol(3), strtod(3), strtol(3), strtoul(3) et ça m'intrigue.
    Dans le monde unixoide, Les manuels sont classés comme suit (liste non exhaustive)
    1. Commandes système
    2. Fonctions système
    3. Fonctions standard du C (C90, C99, peu importe)
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Convertir une chaine hexadecimale en entier
    Par hpalpha dans le forum Contribuez
    Réponses: 0
    Dernier message: 13/02/2011, 17h21
  2. convertir une chaine de caractére en entier
    Par beet2che dans le forum VB.NET
    Réponses: 1
    Dernier message: 02/09/2008, 02h32
  3. Réponses: 16
    Dernier message: 01/09/2008, 20h25
  4. convertir une chaine en entier long
    Par boulhous dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 02/08/2007, 22h22
  5. [VB]Convertir une chaine de caractere en entier
    Par budylove dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/02/2006, 11h06

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