Quali sono i tipi di stringa più utilizzati in C ++ e come convertire tra di loro?
-
09-09-2019 - |
Domanda
o come non uccidere se stessi o qualcuno la prossima volta che il compilatore C ++ torce il braccio per la conversione tra 2 tipi stringa arbitraria solo a pasticciare con te?
Ho un momento difficile codifica in C ++ da quando mi sono abituato a VB6, C #, Ruby, per le operazioni di stringa. Ma ora ho speso più di 30 minuti che tentano di accedere una stringa contenente 2 GUID e una stringa alla finestra di debug ... e non è sempre più facile
E ho già incontrato RPC_WSTR
, std::wstring
e LPCWSTR
Ci sono semplici (o qualsiasi) le norme per conoscere le conversioni tra di loro? Oppure è venuto solo dopo anni di torture?
In sostanza sto cercando i tipi stringa più frequentemente utilizzati in entrambe le API standard e Visual C librerie MS-specifici / ++; Cosa fare la prossima volta, vedo
Error 8 error C2664: 'OutputDebugStringW' : cannot convert parameter 1 from 'std::wstring' to 'LPCWSTR'
Aggiorna : ho fissato il ^^^^ errore di compilazione. Sto cercando una risposta più globale non per la soluzione per il problema specifico che ho elencato come esempio.
Soluzione
Ci sono due tipi built-in stringa:
- C ++ le stringhe utilizzano lo std :: classe string (std :: wstring per i caratteri larghi) stringhe
- C-stile sono const char puntatori const char *) (o
const wchar_t*
)
Entrambi possono essere utilizzati nel codice C ++. La maggior parte delle API, tra cui Windows' sono scritti in C, e in modo da utilizzare puntatori char, piuttosto che la classe std :: string.
Microsoft nasconde ulteriormente questi puntatori dietro un certo numero di macro.
LPCWSTR è un Long puntatore ad una vasta const string , o in altre parole, un const wchar_t*
.
LPSTR è un Long puntatore a stringhe , o in altre parole, un char*
(non const).
Hanno una manciata di più, ma dovrebbero essere abbastanza facile da indovinare una volta che sai queste prime. Hanno anche * TSTR varianti, dove la T è utilizzato per indicare che questo potrebbe essere caratteri sia regolari o ampi, a seconda che Unicode è abilitata nel progetto. LPCTSTR decide di LPCWSTR se UNICODE è definito, e LPCSTR altrimenti.
Quindi, in realtà, quando si lavora con le stringhe, hai solo bisogno di conoscere i due tipi che ho elencato in alto. Il resto sono solo le macro per diverse varianti della versione puntatore char.
La conversione da un puntatore char a una stringa è semplice:
const char* cstr = "hello world";
std::string cppstr = cstr;
E l'altro modo non è molto hader:
std::string cppstr("hello world");
const char* cstr = cppstr.c_str();
Cioè, std::string
prende una stringa in stile C come un argomento nel costruttore. Ed ha una funzione di membro c_str()
che restituisce una stringa in stile C.
Alcune librerie comunemente usati definire i propri tipi di stringa, e in quei casi, dovrete controllare la documentazione per il modo in cui interagiscono con i "propri" corsi di stringa.
Di solito si deve preferire la classe std::string
C ++, come, a differenza di puntatori char, che si comportano come stringhe. Ad esempio:
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.
Altri suggerimenti
Ecco un articolo che copre cosa che serve principalmente per CString
OutputDebugStringW (myString.c_str ());
Benvenuto C ++; -)
Si può solo creare una funzione wrapper che accetta un std::string
. Poi nella funzione di estrarre la stringa di c-stile e passare ad OutputDebugStringW
.
std::wstring
e std::string
sono solo alias per std::basic_string<wchar_t>
e std::basic_string<char>
.
Entrambi hanno un .c_str()
metodo che restituisce un puntatore convenzionale C-stringa (LPCWSTR
etc.) e un costruttore che prende una C-stringa.
Si potrebbe desiderare di guardare CStdString . Si tratta di uno standard cross-platform C ++ CString implementazione che converte la maggior parte degli altri tipi di stringa piuttosto facilmente. Fa quasi tutti i mal di testa legati a corda andare via ed è solo un file di intestazione.