2009-06-03 8 views
4

OU Comment ne pas tuer quelqu'un ou vous-même la prochaine fois que le compilateur C++ tord votre bras pour convertir entre 2 types de chaînes arbitraires juste pour jouer avec vous?Quels sont les types de chaînes les plus utilisés en C++ et comment les convertir?

J'ai du mal à coder en C++ puisque je suis habitué à VB6, C#, Ruby, pour les opérations de chaînes de caractères. Mais maintenant, j'ai passé plus de 30 minutes en essayant de connecter une chaîne contenant 2 GUID et une chaîne à la fenêtre de débogage ... et il est plus facile ne reçois Et je l'ai déjà rencontré RPC_WSTR, std::wstring et LPCWSTR

Existe-t-il des règles simples (ou quelconques) pour connaître les conversions entre eux? Ou est-ce seulement après des années de torture?

Fondamentalement, je suis à la recherche les plus fréquemment les types de chaîne utilisés dans les API standard et les bibliothèques MS-spécifiques/Visual C++; Que faire la prochaine fois, je vois

Error 8 error C2664: 'OutputDebugStringW' : cannot convert parameter 1 from 'std::wstring' to 'LPCWSTR' 

Mise à jour: je fixe la ^^^^ erreur de compilation. Je cherche une réponse plus globale pas pour la solution pour le problème spécifique que j'ai énuméré comme exemple.

+1

Le titre doit inclure Visual C++ au lieu de C++ car la nature de la question concerne les types de chaîne spécifiques à un environnement Windows. – njsf

+0

Je pense qu'il traite des types de chaînes en général. Il vient d'abord rencontré le problème avec une macro spécifique à MS (mais c'est juste une macro pour une chaîne C standard, pas un type séparé) – jalf

+0

Droite .. mis à jour la question à * ne pas être MS/Windows spécifique * – Gishu

Répondre

9

Il existe deux types de chaînes intégrées:

  • C++ chaînes utilisent la classe std :: string (std :: wstring pour les caractères larges)
  • chaînes de style C sont const pointeurs char const char *) (ou const wchar_t*)

Les deux peuvent être utilisés dans du code C++. La plupart des API, y compris Windows, sont écrites en C, et utilisent donc des pointeurs char plutôt que la classe std :: string.

Microsoft cache en outre ces pointeurs derrière un certain nombre de macros. LPCWSTR est un pointeur long vers une chaîne de caractères Const, ou en d'autres termes, un const wchar_t*.

LPSTR est un long pointeur vers la chaîne, ou autrement dit, un char* (non const).

Ils ont une poignée de plus, mais ils devraient être assez faciles à deviner une fois que vous connaissez ces premiers. Ils ont également des variantes * TSTR, où le T est utilisé pour indiquer qu'il peut s'agir de caractères réguliers ou larges, selon que UNICODE est activé dans le projet. LPCTSTR résout à LPCWSTR si UNICODE est défini et LPCSTR sinon.

Donc vraiment, lorsque vous travaillez avec des chaînes, vous avez juste besoin de connaître les deux types que j'ai énumérés en haut. Le reste n'est que des macros pour différentes variantes de la version du pointeur char.

Conversion d'un pointeur char à une chaîne est simple:

const char* cstr = "hello world"; 
std::string cppstr = cstr; 

Et l'inverse est pas beaucoup Hader:

std::string cppstr("hello world"); 
const char* cstr = cppstr.c_str(); 

C'est, std::string prend une chaîne C-style comme un argument dans le constructeur. Et il a une fonction membre c_str() qui renvoie une chaîne de style C.

Certaines bibliothèques communément utilisées définissent leurs propres types de chaînes et, dans ce cas, vous devrez vérifier dans la documentation comment elles interagissent avec les classes de chaînes "correctes".

Vous devriez généralement préférer la classe std::string C++, comme, contrairement à des pointeurs de char, ils se comportent comme des chaînes. Par exemple:

std:string a = "hello "; 
std:string b = "world"; 
std:string c = a + b; // c now contains "hello world" 

const char* a = "hello "; 
const char* b = "world"; 
const char* c = a + b; // error, you can't add two pointers 

std:string a = "hello worl"; 
char b = 'd'; 
std:string c = a + b; // c now contains "hello world" 

const char* a = "hello worl"; 
char b = 'd'; 
const char* c = a + b; // Doesn't cause an error, but won't do what you expect either. the char 'd' is converted to an int, and added to the pointer `a`. You're doing pointer arithmetic rather than string manipulation. 
+0

+1 Merci ... cela m'a fait du sens. – Gishu

2

Voici une article qui couvre chose que vous devez principalement pour

CString
0

Bienvenue ;-) C++

Vous pouvez simplement créer une fonction wrapper qui accepte un std::string. Ensuite, dans la fonction, extrayez la chaîne de style c et passez à OutputDebugStringW.

+0

pour Windows MFC monde juste – yesraaj

1
OutputDebugStringW (myString.c_str()); 
0

std::wstring et std::string ne sont que des alias pour std::basic_string<wchar_t> et std::basic_string<char>.

Les deux ont un .c_str() -method qui renvoie un pointeur de chaîne de caractères conventionnel (LPCWSTR etc.) et un constructeur qui prend une chaîne de caractères.

0

Vous voudrez peut-être regarder CStdString. Il s'agit d'une implémentation C++ CString standard multiplateforme qui se convertit facilement à la plupart des autres types de chaînes. Rend presque tous les maux de tête liés à la chaîne et c'est juste un fichier d'en-tête.

Questions connexes