Quels sont les types de chaîne les plus utilisés en C ++ et comment convertir entre eux?

StackOverflow https://stackoverflow.com/questions/944516

  •  09-09-2019
  •  | 
  •  

Question

OU Comment vous tue pas quelqu'un ou la prochaine fois que le compilateur C ++ tord le bras pour convertir entre 2 types de chaînes arbitraires juste pour jouer avec vous?

J'ai un moment difficile de codage en C ++ depuis que je suis habitué à VB6, C #, Ruby, pour les opérations de chaîne. 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 pas Et je l'ai déjà rencontré RPC_WSTR, std::wstring et LPCWSTR

Y at-il des règles simples (ou tout) pour connaître les conversions entre eux? Ou se fait-il que, après des années de torture?

En fait, 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 pour ne pas la solution pour problème spécifique I répertorié comme un exemple.

Était-ce utile?

La solution

Il y a deux types intégrés de chaîne:

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

Les deux peuvent être utilisés dans le code C ++. La plupart des API, y compris Windows' sont écrits en C, et ils utilisent des pointeurs ombles plutôt que la classe std :: string.

Microsoft cache encore ces pointeurs derrière un certain nombre de macros.

LPCWSTR est Long pointeur sur une chaîne large Const , ou en d'autres termes, un const wchar_t*.

LPSTR est Long pointeur vers la chaîne , ou en d'autres termes, un char* (non const).

Ils ont une poignée plus, mais ils devraient être assez faciles à deviner une fois que vous savez ces premiers quelques-uns. Ils ont également des variantes * TSTR, où T est utilisé pour indiquer que cela pourrait être soit régulier ou caractères larges, selon que UNICODE est activé dans le projet. LPCTSTR décide de LPCWSTR si UNICODE est défini et LPCSTR autrement.

Alors, vraiment, lorsque vous travaillez avec des chaînes, il vous suffit de connaître les deux types I énumérés en haut. Le reste ne sont que des macros pour différentes variantes de la version 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 de membre de c_str() qui retourne une chaîne C-style.

Certaines bibliothèques couramment utilisées définir leurs propres types de chaînes, et dans ces cas, vous devrez vérifier la documentation de la façon dont ils interagissent avec les classes de chaîne « appropriées ».

Vous devriez préférer généralement la classe std::string C ++, comme, contrairement à des pointeurs char, ils comportent sous forme de 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.

Autres conseils

Voici un article qui couvre chose que vous devez principalement pour CString

OutputDebugStringW (myString.c_str ());

Bienvenue sur C ++; -)

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

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

Les deux ont un .c_str() méthode qui renvoie un pointeur conventionnel chaîne de C (LPCWSTR etc.) et un constructeur qui prend une chaîne de C.

Vous pouvez regarder CStdString . Il est une norme C ++ multi-plateforme de mise en œuvre CString qui convertit assez facilement à la plupart des autres types de cordes. Fait presque tous les maux de tête liés à cordes disparaissent et il est juste un fichier d'en-tête.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top