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 :

Concaténer deux LPCWSTR


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut Concaténer deux LPCWSTR
    Bonjour,

    voilà, en gros, j'ai deux variables de type LPCWSTR
    et je voudrais les concaténer en mettant un '.' entre les deux

    Comment dois-je faire?

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    2 solutions: soit tu utilises les MFC, et dans ce cas, une utilisation de CStringW peut faciliter la tache, ou alors tu utilises wcscat() (version UNICODE de strcat())

    donc soit tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    LPWSTR string1 = /*...*/;
    LPWSTR string2 = /*...*/;
     
    CStringW str = string1 + L"." + string2;
    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    WCHAR str[512] = {0};
    wcscat(str, string1);
    wcscat(str, L".");
    wcscat(str, string2);

  3. #3
    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
    Par défaut
    3ème solution : std::wstring : même démarche qu'avec CStringW.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       LPWSTR p_str_1=...;
       LPWSTR p_str_2=...;
       std::wstring str1(p_str_1);
       std::wstring str2(p_str_2);
       std::wstring str_res = str1 + L'.' + str2;
    // ou std::wstring str_res = std::wstring(p_str_1) + L'.' + p_str_2;
    @toxcct : il faut probablement convertir vers un CStringW, sinon c'est addition de pointeur, non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CStringW str = CStringW(string1) + L"." + string2;

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut
    Ok, merci

    Bon j'ai réussi à concaténer mes deux chaînes dans un wstring
    Mais au final, moi je veux un LPCWSTR...

    Donc maintenant :
    Comment je fais pour convertir un wstring en LPCWSTR ??

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par melleb Voir le message
    Comment je fais pour convertir un wstring en LPCWSTR ??
    la classe std::wstring a une methode qui permet d'avoir ca : c_str()

  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
    Par défaut
    Citation Envoyé par melleb Voir le message
    Ok, merci

    Bon j'ai réussi à concaténer mes deux chaînes dans un wstring
    Mais au final, moi je veux un LPCWSTR...

    Donc maintenant :
    Comment je fais pour convertir un wstring en LPCWSTR ??


  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut
    ousp!


    merci merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Es-tu sûr que tu veux vraiment des LPCWSTR, ou ne veux-tu pas plutôt des LPCTSTR ?

    Ce code, qui utilise directement des pointeurs pour être utilisable depuis le C, marche aussi bien pour char, wchar_t et TCHAR/_TCHAR :
    Code C/C++ : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    /*Concat.h */
     
    #ifndef H_CONCAT_20090514_1518
    #define H_CONCAT_20090514_1518
     
    #ifndef EXTERN_C
    	#ifdef __cplusplus
    	#define EXTERN_C extern "C"
    	#else
    	#define EXTERN_C extern
    	#endif
    #endif
     
    #include <tchar.h>
     
    EXTERN_C  char   * ConcatA( char   const* left,  char   const* right);
    EXTERN_C wchar_t * ConcatW(wchar_t const* left, wchar_t const* right);
     
    EXTERN_C void FreeStringA( char   * del);
    EXTERN_C void FreeStringW(wchar_t * del);
     
    #ifdef __cplusplus
    	/* En C++, on fait des surcharges */
    	inline  char   * Concat( char   const* left,  char   const* right) { return ConcatA(left, right); }
    	inline wchar_t * Concat(wchar_t const* left, wchar_t const* right) { return ConcatW(left, right); }
    #else
    	/* En C, on suit le modèle Windows */
     
    	/*Note: Ces fonctions n'ont pas d'implémentation réelle*/
    	_TCHAR * Concat(_TCHAR const* left, _TCHAR const* right);
    	void FreeString(_TCHAR * del);
     
    	#ifdef _UNICODE
    	#define Concat ConcatW
    	#define FreeString FreeStringW
    	#else
    	#define Concat ConcatA
    	#define FreeString FreeStringA
    	#endif
     
    #endif
     
    #endif /* ! H_CONCAT_20090514_1518 */
    Code C++ : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    /* Concat.h */
    #include "Concat.h"
    #include <cstring>
    #include <cwchar>
    #include <new>
    using namespace std;
     
    EXTERN_C char * ConcatA(char const* left, char const* right)
    {
    	size_t const leftLength = strlen(left);
    	size_t const rightLength = strlen(right);
    	size_t const totalLength = leftLength  + rightLength ;
    	char * ret = new(nothrow) char[totalLength + 1];
    	if(ret != NULL)
    	{
    		memcpy(ret+0, left, leftLength * sizeof *ret);
    		memcpy(ret+leftLength, right, rightLength * sizeof *ret);
    	}
    	return left;
    }
     
    EXTERN_C wchar_t * ConcatW(wchar_t const* left, wchar_t const* right)
    {
    	size_t const leftLength = wcslen(left);
    	size_t const rightLength = wcslen(right);
    	size_t const totalLength = leftLength  + rightLength ;
    	wchar_t * ret = new(nothrow) wchar_t[totalLength + 1];
    	if(ret != NULL)
    	{
    		memcpy(ret+0, left, leftLength * sizeof *ret);
    		memcpy(ret+leftLength, right, rightLength * sizeof *ret);
    	}
    	return left;
    }
     
    EXTERN_C void FreeStringA(char * del)
    {
    	delete[] del;
    }
    EXTERN_C void FreeStringW(wchar_t * del)
    {
    	delete[] del;
    }
    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.

  9. #9
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Personne n'a réagi, mais ne SURTOUT PAS faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WCHAR str[512] = {0}; // PAS BIEN
    wcscat(str, string1);
    wcscat(str, L".");
    wcscat(str, string2); // et paf, buffer overflow si wcslen(string1) + 2 + wcslen(string2) > 512
    C'est de la graine de buffer overflow... Le faire correctement double triple pratiquement le nombre de lignes. Passer par des CString ou des std::wstring est une bonne solution, plus concise qui plus est.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Es-tu sûr que tu veux vraiment des LPCWSTR, ou ne veux-tu pas plutôt des LPCTSTR ?
    OUi oui, c'est bien des LPCWSTR
    (il s'agit d'une variable d'une structure utilisée pour une dll que j'utilise...
    donc pas le choix...)

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Dans ce cas, la fonction ConcatW() que j'ai fournie te donnera un LPWSTR, qu'il faudra ensuite libérer avec FreeStringW().

    Mais si tu es purement en C++, autant utiliser une classe de chaîne (CStringW si tu es sous MFC >= 7, std::wstring sinon).
    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.

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

Discussions similaires

  1. Concaténer deux listes
    Par Dunk dans le forum Pascal
    Réponses: 15
    Dernier message: 04/06/2025, 13h39
  2. concaténer deux STRING
    Par cenedra dans le forum C++
    Réponses: 4
    Dernier message: 04/08/2006, 01h18
  3. Concaténer deux fichiers binaires
    Par mickael.be dans le forum Delphi
    Réponses: 7
    Dernier message: 30/07/2006, 13h11
  4. Réponses: 6
    Dernier message: 27/05/2004, 10h41
  5. Concaténer deux variables ?
    Par glsn dans le forum ASP
    Réponses: 2
    Dernier message: 19/12/2003, 13h53

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