Преобразовать std:: wstring в WCHAR *

Я не знаю, как преобразовать std::wstring в WCHAR*

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

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

Кто-нибудь знает, как это сделать?

Ответы

Ответ 1

Если вы хотите конвертировать из std::wstring в const WCHAR* (т.е. возвращенный указатель предоставляет доступ только для чтения к содержимому строки), то вызов метода std::wstring::c_str() выполняется нормально:

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

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

Вместо этого, если вы хотите изменить std::wstring контент, все по-другому. Вы можете использовать &wstr[0] (где wstr - непустой экземпляр std::wstring) для доступа к содержимому std::wstring (начиная с адреса его первых символов и отмечая, что символы хранятся смежно в памяти), но вы должны обратить внимание на то, чтобы не перераспределять предварительно выделенную память.

В общем случае, если у вас есть std::wstring длины L, вы можете получить доступ к символам из индекса 0 до (L-1).
Замена завершающего '\0' (находится в индексе L) - это поведение undefined (на практике это ОК на Visual С++, по крайней мере, с VC9/VS2008 и VC10/VS2010).

Если строка имеет неправильный размер (т.е. она недостаточно велика для ваших нужд), вы можете вызвать std::wstring::resize(), чтобы освободить место для новых символов (т.е. изменить размер внутреннего буфера std::wstring), а затем использовать &wstr[0] для чтения-записи std::wstring.

Ответ 2

Если строка уже имеет правильную длину и ее не нужно менять, вы можете получить указатель не const, указав на первый символ:

WCHAR * wpProcToSearch = &wstrProcToSearch[0];

Это гарантированно работает в С++ 11, и нет известных реализаций С++ 03, где это не так.

Если вам нужен только указатель const, вы должны использовать c_str:

const WCHAR * wpProcToSearch = wstrProcToSearch.c_str();

Ответ 3

Я думаю, вы можете использовать

wpProcToSearch = wstrProcToSearch.c_str()

как вы делаете с обычным std::string.

Ответ 4

Я рекомендую этот подход:

wstring str = L"Hallo  x     y   111 2222  3333 rrr 4444   ";
wchar_t* psStr = &str[0];

Это довольно просто, но вы не можете изменить длину строки вообще. Поэтому перемещение "\ 0" может быть недействительным...