2013-04-19 13 views
15

nie mam pojęcia, jak konwertować std::wstring Do WCHAR*Konwersja std :: wstring do WCHAR *

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

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

Czy ktoś wie jak to osiągnąć?

+2

'.c_str()', hm? –

+0

http://en.cppreference.com/w/cpp/string/basic_string/c_str ... zakładając, że "const WCHAR *" jest dopuszczalne. –

+0

Co jest nie tak z 'const wchat_t *'? Co chcesz z tym zrobić? I naprawdę nienawidzę tych typów Windows! Nie potrzebujemy 'WCHAR'! –

Odpowiedz

19

Jeśli chcesz przekonwertować z std::wstring do const WCHAR* (czyli zwrócony wskaźnik daje dostęp tylko do odczytu do treści strun), następnie wywołanie std::wstring::c_str() metoda jest po prostu w porządku:

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

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

Zamiast tego, jeśli chcesz modyfikowaćstd::wstring - treści są różne. Możesz użyć &wstr[0] (gdzie wstr jest niepustą instancją std::wstring), aby uzyskać dostęp do zawartości std::wstring (zaczynając od adresu pierwszych znaków i zauważając, że znaki są przechowywane w pamięci w sposób ciągły), ale musisz zwrócić uwagę na nie ma wstępnie przydzielonej pamięci ciągu.

W ogóle, jeśli masz std::wstring długości L, można uzyskać dostęp do znaków z indeksu 0 do (L-1).
Overwriting the terminating '\0' (znajdujący się w indeksie L) to niezdefiniowane zachowanie (w praktyce jest to w porządku w Visual C++, przynajmniej z VC9/VS2008 i VC10/VS2010).

Jeśli łańcuch nie ma właściwego rozmiaru (czyli nie jest wystarczająco duży dla swoich potrzeb), następnie możesz zadzwonić std::wstring::resize() aby zrobić miejsce dla nowych znaków (czyli zmiany rozmiaru wewnętrznego bufora std::wstring „s), a następnie użyć &wstr[0] czytać -write std::wstring - treść.

+0

Nadpisywanie terminatora z 'charT()' jest teraz legalne. – Deduplicator

+0

@Deduplicator: Czy jest to dodatek z C++ 17? Czy mógłbyś podać oficjalne referencje? Dzięki. –

+0

Zobacz najnowszą i zaakceptowaną odpowiedź na pytanie, które łączysz, jest w WP dla C++ 17. – Deduplicator

8

myślę, że można użyć

wpProcToSearch = wstrProcToSearch.c_str()

jak zrobić z normalnego std :: string.

+0

dziękuję, użyłem \t wpProcToSearch = (WCHAR *) wstrProcToSearch.c_str() od .c_str() tworzy const wchar_t – Jona

+0

Dlaczego, możesz rzucić go do wszystkiego, co chcesz, a kompilator nie będzie miał nic przeciwko ..... .. –

13

Jeśli łańcuch jest już właściwa długość i nie będą musiały być zmienione, można uzyskać non-const wskaźnik poprzez wskaźnik do pierwszego znaku:

WCHAR * wpProcToSearch = &wstrProcToSearch[0]; 

To jest gwarantowane do pracy w C++ 11 i nie ma znanych implementacji C++ 03, gdzie nie ma.

Jeśli potrzebujesz tylko const wskaźnik należy użyć c_str:

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

Powinieneś chyba dodać wyjaśnienia, jak długo te wskaźniki pozostaną ważne. –

+0

@DavidHeffernan, bardzo dobry punkt. Czy wiesz, czy standard wspomina o tym, które operacje mogą unieważnić wskaźnik? –

+0

Nie moja specjalizacja. Przepraszam. To twoje pole nie moje! –

Powiązane problemy