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

Visual C++ Discussion :

conversion string to char* et erreur ATL CString


Sujet :

Visual C++

  1. #1
    Membre du Club
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Points : 58
    Points
    58
    Par défaut conversion string to char* et erreur ATL CString
    Bonjour,

    J'ai un bout de code que je ne comprend pas trop
    car je dois convertir un string en char* et j'ai le message d'erreur suivant pourtant j'inclu bien mes header :


    #include<string>
    using std::string



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CString m_strvariable;
    char* charstr;
     
    charstr=m_strvariable.c_str();   // erreur
    J'ai l'erreur C2039 'c_str' : n'est pas membre de ATL::CStringT<Base Type,StringTraits>

    Donc apparement j'utilise du Win32. Par contre ATL et MFC c'est bien identique? Dois-je utiliser un autre header? ou bien simplement convertir mon CString en std::string?

    Autrement je peux convertir CString mais en const Char* uniquement avec ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    charstr= (LPCTSTR) m_strvariable;

    Merci

  2. #2
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Pour du pur Win32 tu as la classe string et non CString

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    string m_strvariable;     // pas de CString ici
    char* charstr;
     
    charstr=m_strvariable.c_str();  // à vérifier je crois que string::c_str() retourne un const char*
    Pour de l'ATL ou MFC tu as la classe CString

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CString str = "ma chaîne";
    LPSTR szBuffer = str.GetBuffer();
    // j'utilise mon szBuffer...
    str.ReleaseBuffer(); // je n'oublie pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CString str = "ma chaîne";
    LPSTR szBuffer = (LPSTR)(LPCSTR) str;  // tu as aussi ce choix
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CString str = ma chaîne;
    LPSTR szBuffer = str.GetString();  // tu as encore aussi ce choix

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Ton premier code ne devrait pas compiler, c_str() retourne un pointeur const.
    Il n'existe aucun moyen d'obtenir un pointeur non-const sur les caractères d'une std::string (excepté un const_cast, bien sûr).
    Ton 3e code est un hack et pire, il fait ça avec les opérateurs de cast C au lieu du const_cast.
    Ton 4e code ne compilera pas, le pointeur retourné par GetString() est const également.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Déconseillé, c'est un hack:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    string m_strvariable;
    char* charstr;
     
    //C'est un hack.
    charstr = const_cast< char * >(m_strvariable.c_str());
    Ce code-ci est OK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CStringA str = "ma chaîne";
    LPSTR szBuffer = str.GetBuffer();
    // j'utilise mon szBuffer...
    str.ReleaseBuffer(); // je n'oublie pas
    C'est un hack:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CStringA str = "ma chaîne";
    LPCSTR sczStr = str;
    LPSTR szBuffer = const_cast< LPSTR >(sczStr);
    C'est encore un hack:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CStringA str = ma chaîne;
    LPSTR szBuffer = const_cast< LPSTR >(str.GetString());

  5. #5
    Membre du Club
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Points : 58
    Points
    58
    Par défaut
    Re,

    Desole pour ce retard, merci bcp, j'ai utilise la methode GetBuffer() et releaseBuffer() pour liberer mon CString.

    Comment est-ce que ce code peut etre un hack ?

    code: charstr = const_cast< char * >(m_strvariable.c_str());


    Merci

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Très simple, il nécessite un const_cast.
    Nul n'est supposé avoir un accès en écriture au buffer interne d'une std::string.
    Tout accès en écriture vers ce buffer est donc un hack.

Discussions similaires

  1. [Débutant] Conversion string vers char
    Par sachaaaz dans le forum C#
    Réponses: 6
    Dernier message: 12/03/2012, 12h42
  2. conversion string en char *
    Par nana38000 dans le forum Débuter
    Réponses: 7
    Dernier message: 02/04/2010, 15h49
  3. Conversion string to char *
    Par uriotcea dans le forum Débuter
    Réponses: 2
    Dernier message: 22/12/2009, 13h51
  4. conversion String to char*
    Par warning dans le forum C++Builder
    Réponses: 5
    Dernier message: 07/12/2007, 12h29
  5. Conversion String vers char
    Par benwit dans le forum Langage
    Réponses: 27
    Dernier message: 30/03/2007, 15h01

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