2013-04-19 15 views
15

non ho idea di come convertire un std::wstring ad un WCHAR*Converti std :: wstring a WCHAR *

std::wstring wstrProcToSearch; 
WCHAR * wpProcToSearch = NULL; 

std::wcin >> wstrProcToSearch; // input std::wstring 
// now i need to convert the wstring to a WCHAR* 

Qualcuno sa come per raggiungere questo obiettivo?

+2

'.c_str()', hm? –

+0

http://en.cppreference.com/w/cpp/string/basic_string/c_str ... assumendo che 'const WCHAR *' è accettabile. –

+0

Cosa c'è di sbagliato in 'const wchat_t *'? Cosa vuoi fare con esso? E odio davvero quei tipi di Windows! Non abbiamo bisogno di 'WCHAR'! –

risposta

19

Se si desidera convertire std::wstring-const WCHAR* (cioè il puntatore restituito dà accesso in sola lettura al contenuto della stringa), quindi chiamando std::wstring::c_str() metodo è più che bene:

std::wstring wstrProcToSearch; 
std::wcin >> wstrProcToSearch; // input std::wstring 

// Convert to const WCHAR* (read-only access) 
const WCHAR * wpszProcToSearch = wstrProcToSearch.c_str(); 

Invece, se si desidera modificare std::wstring 's, le cose sono diverse. È possibile utilizzare &wstr[0] (dove wstr è un'istanza non vuota di std::wstring) per accedere al contenuto di std::wstring (a partire dall'indirizzo dei suoi primi caratteri e notare che i caratteri sono memorizzati in modo contiguo nella memoria), ma è necessario prestare attenzione a non sovraccaricare la memoria pre-allocata della stringa.

In generale, se si dispone di un std::wstring lunghezza L, è possibile accedere ai caratteri dall'indice 0 a (L-1).
Overwriting the terminating '\0' (che si trova nell'indice L) è comportamento non definito (in pratica, è OK su Visual C++, almeno con VC9/VS2008 e VC10/VS2010).

Se la stringa non ha la dimensione corretta (vale a dire che non è abbastanza grande per le vostre esigenze), allora è possibile chiamare std::wstring::resize() per fare spazio a nuovi personaggi (ad esempio il ridimensionamento interno tampone std::wstring s'), e quindi utilizzare &wstr[0] per leggere -write std::wstring contenuto.

+0

La sovrascrittura del terminatore con 'charT()' è ora legale. – Deduplicator

+0

@Deduplicator: è un'aggiunta da C++ 17? Potresti fornire un riferimento ufficiale? Grazie. –

+0

Vedere la risposta più recente e accettata sulla domanda che hai collegato, è nel WP per C++ 17. – Deduplicator

8

Penso che si possa utilizzare

wpProcToSearch = wstrProcToSearch.c_str()

come si fa con un normale std :: string.

+0

grazie, ho usato \t wpProcToSearch = (WCHAR *) wstrProcToSearch.c_str() poiché .c_str() crea un const wchar_t – Jona

+0

Perchè, puoi lanciarlo su qualsiasi cosa tu voglia, e al compilatore non dispiacerà ..... .. –

13

Se la stringa è già la lunghezza corretta e non avrà bisogno di essere cambiato, è possibile ottenere un puntatore non-const prendendo un puntatore al primo carattere:

WCHAR * wpProcToSearch = &wstrProcToSearch[0]; 

Questo è garantito il funzionamento in C++ 11 e non ci sono implementazioni conosciute di C++ 03 dove non lo sono.

Se avete solo bisogno di un puntatore const si dovrebbe usare c_str:

const WCHAR * wpProcToSearch = wstrProcToSearch.c_str(); 
+1

Dovresti forse aggiungere qualche spiegazione su quanto a lungo questi puntatori rimarranno validi. –

+0

@DavidHeffernan, ottimo punto. Sai se lo standard accenna a quali operazioni potrebbero invalidare il puntatore? –

+0

Non la mia area di competenza. Scusate. Questo è il tuo campo non mio! –

Problemi correlati