Quali sono i tipi di stringa più utilizzati in C ++ e come convertire tra di loro?

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

  •  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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top