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.
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
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
Droite .. mis à jour la question à * ne pas être MS/Windows spécifique * – Gishu