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 :

Convertion String to Long


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 35
    Points : 27
    Points
    27
    Par défaut Convertion String to Long
    Bonjour,

    Quelqu' un peut-il me pretter son oeil sur ce problème ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        std::istringstream iss( "2147483650" );
        long nombre;
        iss >> nombre;
    Resultat : nombre =0xcccccccc

    Merci.

    Pourtant ca doit marcher ?
    http://cpp.developpez.com/faq/cpp/in...RINGS_strtonum

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Tu depasse la capacite dun long. Passe ton long en unsigned long.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre actif Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Points : 257
    Points
    257
    Par défaut
    Ta conversion échoue sûrement. il te faut tester le résultat de la conversion
    regarde http://cpp.developpez.com/faq/cpp/index.php?page=strings#STRINGS_convert_to

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Points : 79
    Points
    79
    Par défaut
    Bonjour,

    Essaie avec un 'unsigned long' plutôt...

    [EDIT] Bon, on m'est passé devant... [/EDIT]

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 35
    Points : 27
    Points
    27
    Par défaut
    Voici un extrait de code exact. Je récupère une info qui me donne le type d'un variant et je converti la valeur associée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      if(l_str_variantType == std::string("VT_I4"))
      {
        p_o_variant.vt = VT_I4;
        l_str_temp = l_sstr_temp.str();
        l_sstr_temp >> p_o_variant.lVal;        
     
        sscanf(l_str_temp.c_str(), "%ld", &p_o_variant.lVal);
      }
    l_sstr_temp >> p_o_variant.lVal;
    donnec un résultat en 0xcccccccc

    Par contre le scanf me donne bien la valeur : 2147483650 soit 0x80000002

    Je pense que cela vient bien d'un soucis de débordement me je ne vois pas !!!

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    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
    #include <iostream>
    #include <sstream>
     
    int main()
    {
        std::istringstream iss( "2147483650" );
        long nombre;
        if(iss >> nombre)
        {
            std::cout<<nombre<<"\n";
        }
        else
        {
            std::cout<<"erreur de conversion\n";
        }
     
        return 0;
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 35
    Points : 27
    Points
    27
    Par défaut
    Ok , mais pourquoi cette erreur de conversion, avec le istringstream et pas avec le sscanf ???

  8. #8
    Membre actif
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Points : 213
    Points
    213
    Par défaut
    Es-tu sûr de la valeur "2147483650" ? Mon hypothèse est la suivante : ton nombre est plus long dans la chaine du coup le >> foire mais sscanf tronque une partie ce qui ne donne pas 0xcccccc. Mais ce n'est qu'un hypothèse : je n'ai pas la moindre idée de comment est implémentée sscanf.

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Le fait est que 0xcccccccc est une valeur utilisée par VS en mode debug pour représenter... une valeur erronnée (d'ailleur, 0xcccccccc ne donne pas 2 147 483 650 )

    Il y a fort à parier que, si tu passait en mode "release", tu obtiendrais une autre valeur

    Le problème est bel et bien du... à un dépassement de valeur, car, classiquement, un long est codé sur 32 bits et autorise donc une plage de valeurs comprise entre 0 et 2 147 483 647 et 2 147 483 647 pour les long.

    La valeur que tu essaye de convertir se trouve donc... juste trois unités trop haut pour que la conversion en long signé puisse se faire

    Bref : les solutions proposées d'utiliser un long long ou un unsigned long sont toutes deux valides
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 35
    Points : 27
    Points
    27
    Par défaut
    Bonjour,

    J'ai retenu la solution suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if(l_str_variantType == std::string("VT_I4"))
      {
        unsigned long l_l_variantValue;
     
        p_o_variant.vt = VT_I4;
        l_sstr_temp >> l_l_variantValue;
        p_o_variant.lVal = (long)l_l_variantValue;
      }
    En effet je pense que la convertion du stringstream doit tester quelque part la cohérence du résultat et refuser la conversion car pour lui la valeur deborde(Je pensais obtenir un nombre négatif 0x80000002, ce qui n'est pas logique c'est vrai car en entrée j'ai une représentation positive ! mais bon c'est commee ca).

    Ce test n'est pas fait avec le scanf qui ne prend en compte que la représentation hexa(On a bien un nombre négatif au debugger).

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

Discussions similaires

  1. Conversion d'un String en long
    Par arsenik7 dans le forum Langage
    Réponses: 6
    Dernier message: 13/04/2006, 11h51
  2. Réponses: 2
    Dernier message: 06/12/2005, 12h01
  3. Convertion string => entier
    Par en_gel_ho dans le forum Requêtes
    Réponses: 4
    Dernier message: 01/06/2005, 12h59
  4. convertion string --> long
    Par JulienT dans le forum Langage
    Réponses: 3
    Dernier message: 23/03/2005, 23h05
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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