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 :

[débutant mais pas trop] conversion string->entier


Sujet :

C++

  1. #1
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut [débutant mais pas trop] conversion string->entier
    Bonjour,

    dans la FAQ, il est expliqué Comment convertir une string en un entier, il faut passer par un std::istringstream.
    Moi ça m'embète un peu, vu que la fonction strtol me le fait aussi, mais sans avoir besoin d'une variable supplémentaire. Est-ce qu'il y a une bonne raison de préférer la méthode de la faq à strtol? A part "strtol c'est du C et pas du C++", ou alors expliquez-moi pourquoi ceci est une bonne raison s'il vous plait. Car c'est vrai que je suis "obligé" d'utiliser du C++, car j'ai besoin d'objets, d'héritage, de polymorphisme, etc etc, mais parfois pour faire un "petit truc " du genre, le C++ devient plus compliqué que le C et j'aimerais savoir pourquoi, dans ces moments, je devrais quand même insister et fuir la "simplicité du C" comme la peste.

    Je vois déja venir qqun me dire que crée une variable de plus c'est pas très compliqué. En effet. Mais d'une part ça n'est pas la question, et d'autre part, ça m'amène à une deuxième question:

    Comment convertir un string en un réel?
    Dans la faq, il y a bien Comment convertir une string en un objet de n'importe quel type Mais la ça devient franchement plus compliqué qu'un simple strtod non?

    merci d'avance de me donner vos avis

  2. #2
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Je vais te donner mon avis et elle vaut ce quel vaut :

    Quand tu travail sur un projet successible de devenir complexe, tu n'as pas envies de passer du temps sur des problèmes futiles du style "conversion de ceci en cela", "gérer les fuites mémoires", etc. Tout simplement parce que ça ne sont pas tes problèmes principaux et que d'autres personnes avant toi les ont déjà étudié et résolu.

    Je vais te donner un bon conseil : utilise le moins possible de fonctions CRT (fonctions appartenant à la librairie C Run-Time).
    Il est bien entendu conseillé de passer par là pour apprendre les fonctionnements de base, mais tu te rendra très vite compte que tes codes vont se dupliquer parce que tu te poseras n fois les même questions du genre "j'ai une chaîne de caractères et je veux en faire un unsigned short"... et vraiment bcp bcp d'autres questions du même style.

    Les fonctions CRT sont des fonctions de très bas niveau. Elles ne sont pas pratiques, incomplètes et parfois dangereuses et c'est pour cela qu'il existe des surcouche comme la STL.

    Personnellement, je te conseil de très vite installer une librairie comme Boost (par exemple) : http://www.boost.org
    C'est une librairie à template basé sur la STL très bien faite, bien documenté et qui propose des fonction bien pratique ^^

    Quand tu cherches à faire quelques choses en C++, je te conseil de regarder si ça n'existe pas déjà dans Boost, si ça n'y est pas regarde dans la STL et en dernier recours la CRT.

    Par exemple pour tes problèmes de conversions, tu peux utiliser les fonctions boost::lexical_cast

    ...
    #include <boost/lexical_cast.hpp>
    ...
    using namespace boost;
    ...
    string txt = "28.654";
    ...
    float a = lexical_cast<float>(txt);
    double b = lexical_cast<double>(txt);
    unsigned int c = lexical_cast<unsigned int>(txt);
    string d = lexical_cast<string>(16978.3201);
    ...

    voilà, je ne suis pas sur de répondre entierement à ta question et si c'est le cas je m'en excuse. Si je peux faire quelque chose pour t'aider... n'hesite pas ^^

    ++

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut Re: [débutant mais pas trop] conversion string->entier
    Citation Envoyé par Biosox
    Moi ça m'embète un peu, vu que la fonction strtol me le fait aussi, mais sans avoir besoin d'une variable supplémentaire. Est-ce qu'il y a une bonne raison de préférer la méthode de la faq à strtol? A part
    Je pense que la principale raison en l'occurence est l'extensibilité. Le C a prévu des fonctions pour convertire quelques types de base. Le C++ part lpus sur un framework permettant de convertir tous les types, y compris ceux définis par toi. C'est plus lourd à comprendre, certes, mais a priori plus simple à utiliser. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <class T> f(T &t)
    {
      t = strto??("toto");
    }
    Avec une fonction de conversion C, je ne sais pas faire (dans le même ordre d'idée, voir MAX_INT et std::numeric_limits<int>::max()).

    Une autre raison possible, pour les conversions vers les strings surtout, est que de toute façon, il faudra dans la plupart des cas spécifier un formattage, alors autant réutiliser le formattage déjà défini pour l'affichage.

    Quand cette dernière contrainte n'est pas importante, et les perfs non plus, boost::lexical_cast est effectivement très agréable.

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Hum ... ce n'est pas réentrant ...

  5. #5
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut
    Merci beaucoup pour vos réponses.

    En effet l'extensibilité est un bon argument. Je trouvais la conversion string en réel difficile car je ne suis pas du tout habitué aux classes "templates" mais je vais définitivement devoir m'y mettre plus a fond.

    Je ne connais pas encore "boost" mais je vais m'y interesser aussi

    Luc Hermitte, je ne comprends pas ce que tu as voulu dire?

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Juste ce qui il y écrit dans le man -> si tu veux la version réentrante ... il faut utiliser une autre fonction qui n'est propablement pas portable vu le tiret bas préfixant celle signalée dans la doc de la libc de chez GCC.

    Quant à la réentrance, c'est la faculté qu'a une fonction à s'exécuter simulatément depuis deux threads/process (ou même si récursion indirecte il y a, crois bien) -> hop deuxième lien sous google http://www.slac.stanford.edu/comp/un...eentrancy.html

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/02/2009, 17h59
  2. conversion string vers entier
    Par k_boy dans le forum VC++ .NET
    Réponses: 4
    Dernier message: 11/04/2007, 13h33
  3. Acheter un vieux PC, mais pas trop quand même
    Par Maxoo dans le forum Ordinateurs
    Réponses: 30
    Dernier message: 22/03/2007, 09h49
  4. Un programme qui veut bosser; mais pas trop.
    Par Flodelarab dans le forum C++
    Réponses: 8
    Dernier message: 28/08/2006, 15h33
  5. [Humour gras] mais pas trop gras non plus
    Par Commodore dans le forum La taverne du Club : Humour et divers
    Réponses: 6
    Dernier message: 20/07/2006, 02h37

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