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 :

Conversion de String vers int


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut Conversion de String vers int
    Bonjour,

    J'ai besoin de convertir en int un nombre lu dans un fichier texte, et contenu dans une string, pour faire des opérations dessus.
    Je suis sous Visual studio 2005, et c'est un projet MFC

    J'ai utilisé la méthode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int IDentier;
    IDentier=atoi(IDchaine.c_str());
    Problème : j'ai toujours 0 dans IDentier.

    Je pensais que c'était peut être un problème d'unicode, j'ai donc essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int IDentier;
    IDentier=_wtoi(IDchaine.c_str());
    Cette fois, une erreur se produit à la complation :
    1>error C2664: '_wtoi' : impossible de convertir le paramètre 1 de 'const char *' en 'const wchar_t *'
    Quelqu'un a une solution?

    Merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Points : 57
    Points
    57
    Par défaut
    Salut

    teste ceci et dit moi si ça marche

    j'ai testé avec Code::Blocks est il n'y a pas de problème

    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
    #include <iostream>
    #include <sstream>
     
    using namespace std;
     
    int main()
    {
        int nombre;
        string st="123";
     
        istringstream iss( st );
        // convertir en un int
     
        iss >> nombre;
     
        cout << "Hello world!  :"<< nombre << endl;
     
        return 0;
    }

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    Points : 149
    Points
    149
    Par défaut Une autre solution "string to int"


    Une autre solution "string to int" :

    int StringToInt(std::string in)
    {
    return atoi(in.c_str());
    }

    A+,
    Agamitsudo.
    Un ordinateur fait au bas mot 1 million d'opérations à la seconde, mais il n'a que ça à penser, aussi. (brèves de comptoirs, JM.Gourio)


  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par getdz Voir le message
    Salut

    teste ceci et dit moi si ça marche

    j'ai testé avec Code::Blocks est il n'y a pas de problème

    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
    #include <iostream>
    #include <sstream>
     
    using namespace std;
     
    int main()
    {
        int nombre;
        string st="123";
     
        istringstream iss( st );
        // convertir en un int
     
        iss >> nombre;
     
        cout << "Hello world!  :"<< nombre << endl;
     
        return 0;
    }
    Je viens de tester, et ça me met :
    1>error C2079: 'iss' utilise une class de 'std::basic_istringstream<_Elem,_Traits,_Alloc>' non défini

    1>error C2440: 'initialisation' : impossible de convertir de 'std::string' en 'int'
    (pour la ligne istringstream iss( st )

    J'ai aussi un warning, mais je pense qu'il est lié à cette erreur :

    1>warning C4552: '>>' : opérateur sans effet ; opérateur avec effet secondaire attendu

    int StringToInt(std::string in)
    {
    return atoi(in.c_str());
    }
    C'est pareil que ce que j'ai, non? (à part que tu le met dans une fonction, et que je le fais directement, ...)

    Je test quand même mais je suis pas convaincu.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    C'est pareil que ce que j'ai, non? (à part que tu le met dans une fonction, et que je le fais directement, ...)

    Je test quand même mais je suis pas convaincu.
    Je confirme, ça donne le même résultat : j'ai toujours 0 dans mon int.

    Si j'utilise _Wtoi, j'ai la même erreur que précédemment.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    En fait, je n'ai plus d'erreur de compilation maintenant. J'avais juste oublié de mettre #include <sstream>. Désolé.

    Par contre, au lieu d'avoir un 0 à chaque fois comme avec la méthode précedente, j'ai -858993460.
    Si je met en unsigned int, j'ai 3435973836.

    J'ai bien vérifié en mode débuggueur, la string contient bien mon chiffre, sans éspace ou autre caractère.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par CyberSlan Voir le message
    En fait, je n'ai plus d'erreur de compilation maintenant. J'avais juste oublié de mettre #include <sstream>. Désolé.

    Par contre, au lieu d'avoir un 0 à chaque fois comme avec la méthode précedente, j'ai -858993460.
    Si je met en unsigned int, j'ai 3435973836.

    J'ai bien vérifié en mode débuggueur, la string contient bien mon chiffre, sans éspace ou autre caractère.
    Salut

    j'ai pas compris ce que tu veux dire.

    Est que avec ma méthode, ça a marché?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Désolé, j'ai pas été très clair,

    C'est avec ta méthode que j'ai réussi à faire tourner le programme sans erreur de compilation (j'avais une erreur dans un premier temps car je n'avais pas mis : #include <sstream> )

    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
    #include <iostream>
    #include <sstream>
     
    using namespace std;
     
    int main()
    {
        int nombre;
        string st="123";
     
        istringstream iss( st );
        // convertir en un int
     
        iss >> nombre;
     
        cout << "Hello world!  :"<< nombre << endl;
     
        return 0;
    }
    Le problème c'est que quel que soit la valeur de st, j'obtiens -858993460 dans nombre, si nombre est de type int, et 3435973836 si nombre est de type unsigned int.

    En clair, j'ai créé la classe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int CClasses::StringToInt(std::string in)
    {
    	int out;
    	istringstream iss( in );
    	iss>>out;
    	return out;
    }
    et la valeur retournée est toujours -858993460

  9. #9
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut


    Chez moi ça fonctionne très bien. Dans ma lib perso j'ai d'ailleurs la fonction suivante que j'utilise très souvent et qui fait la même chose que le code proposé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /**
    *       convert a std::string into any type
    *       @param   str      string to convert
    *       @param   dest     value built from the input string
    *       @return  true if convertion succeeded, false if failed
    */
    template<typename T>
    bool FromString( const std::string & str, T & dest )
    {
       std::istringstream iss( str );
       return ( iss >> dest != 0 );
    }
    Quel compilateur/IDE utilises-tu?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    J'utilise Visual studio 2005, en MFC, et le projet utilise les caractères unicode

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne vois pas comment ça peut causer ce genre de problème, même en unicode...
    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.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Est ce qu'il y a d'autres paramètres importants du projet qui pourraient être en cause?

    ou une autre fonction permettant de gérer la conversion string->int?

    Au cas où, voilà les libraires incluses au fichier qui contient ma classe (dans le fichier cpp):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "stdafx.h"
    #include "CryptageCle.h"
    #include "AccueilDlg.h"
    #include "Classes.h"
     
    #include <fstream>
    #include <iostream>
    #include <sstream>
     
    using namespace std;
    Dans le fichier .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <sstream>
    class CClasses
    {
    public:
    	int CClasses::StringToInt(std::string in);	//Converti de string vers int
    };
    Et celles du fichier qui y fait appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "stdafx.h"
    #include "CryptageCle.h"
    #include "GererSerrures.h"
    #include "Classes.h"
     
    #include <fstream>
    #include <iostream>
    #include <sstream>
     
    using namespace std;
    Merci quand même pour tous vos messages précédents, même si pour le moment, le problème n'est pas résolu

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    -858993460, c'est 0xCCCCCCCC, (la valeur des variables locales non-initialisées quand on compile en Debug).
    3435973836, c'est pareil en non-signé.
    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.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Effectivement, si j'initialise out à une certaine valeur, j'obtiens cette valeur en sortie. Ma fonction ne fait donc rien du tout

    Je ne vois vraiment pas ce qui bloque...

    En mode Release, j'ai 2084894365 (0x7C44F69D), je suppose que c'est la valeur des variable non-initialisées pour ce mode.


    Sinon, j'ai essayé de copier mon projet sur un autre ordinateur avec visual studio 2005, et il y a le même problème. Ce n'est donc pas un problème lié à mon installation, mais au projet lui même.

  15. #15
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Il n'y aurait pas des problème de compatilité entre la MFC et la lib standard?
    Je demande ça car je vois que tu utillises l'en-tête stdafx.h, il y a donc de fortes chances pour que tu utilises la MFC.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En fait, on dirait que c'est l'opérateur >> qui ne fait rien...
    Que donnent les bits d'états (good, bad, etc) du stream après l'utilisation du >> ?
    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.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Depuis le début, je fais mes tests avec les strings lus dans mon fichier. Je viens de tester avec une string définie directement dans le code, et ça marche.

    Le problème viens donc de ma lecture dans le fichier.

    Je n'avais pas testé ça avant, car quand je regarde mes variable en mode debug, elles contiennent bien les bonnes valeurs, et je ne pensasi pas que ça changerait quelque chose.

    voilà mon code de lecture dans le fichier :

    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
    char fichierSignet[12]="random.lock";
    	std::ifstream fichier(fichierSignet, std::ios::in);
    	if (fichier)
    	{
    		while (!fichier.eof())
    		{
    			string IDrandomrec, RANDOMrec;
    			fichier >> IDrandomrec >> RANDOMrec;
    		}
    		fichier.close();
    	}
    	else
    	{
    		MessageBox(_T("Erreur d'ouverture du fichier random.lock"));
    	}
    J'utilise ensuite la fonction disponible plus haut pour convertir les valeurs de IDrandomrec et RANDOMrec, ce qui pose problème.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par r0d Voir le message
    Il n'y aurait pas des problème de compatilité entre la MFC et la lib standard?
    Je demande ça car je vois que tu utillises l'en-tête stdafx.h, il y a donc de fortes chances pour que tu utilises la MFC.
    En fait, on dirait que c'est l'opérateur >> qui ne fait rien...
    Que donnent les bits d'états (good, bad, etc) du stream après l'utilisation du >> ?
    Désolé, j'étais en train de taper mon message. Le problème ne vient pas de ma fonction de conversion, mais de la lecture dans le fichier, comme vous avez pu le lire.

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    C'est bon, j'ai trouvé le problème :
    Les valeurs de IDrandomrec et RANDOMrec étaient réinitialisée à chaque passage dans la boucle. Elles étaient donc réinitialisées au moment ou je les convertissaient.
    Je les ai donc initialisées avant la boucle, et ça marche.

    Merci pour votre aide, et désolé de vous avoir fait perdre du temps pour ça, alors que le problème venait d'ailleurs.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Points : 57
    Points
    57
    Par défaut
    Salut

    Essai de créer un new projet tous simple et test le code.

    Regardes si ça marche.

    Remarque:

    L'utilisation MFC rend ton code non portable. Si tu développe en C++ je te conseille d'utiliser Code::Blocks ( opensource et multi-plaforme).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Conversion de donnée string vers int
    Par reptooyep dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 05/06/2013, 22h40
  2. Conversion String ver int
    Par maparè dans le forum Langage
    Réponses: 3
    Dernier message: 23/01/2010, 00h23
  3. Conversion String vers Int ?
    Par manworms2 dans le forum C++Builder
    Réponses: 1
    Dernier message: 08/12/2008, 08h36
  4. conversion string vers int
    Par canary dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 11/05/2008, 18h35
  5. conversion string vers int
    Par mathher dans le forum C++
    Réponses: 4
    Dernier message: 14/04/2006, 17h52

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