简体   繁体   中英

Convert std::wstring to WCHAR*

I have no idea how to convert a std::wstring to a WCHAR*

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

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

Does anyone know how to accomplish this?

If you want to convert from std::wstring to const WCHAR* (ie the returned pointer gives read-only access to the string content), then calling std::wstring::c_str() method is just fine:

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

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

Instead, if you want to modify std::wstring 's content, things are different. You can use &wstr[0] (where wstr is a non-empty instance of std::wstring ) to access the content of the std::wstring (starting from the address of its first characters, and noting that characters are stored contiguously in memory), but you must pay attention to not overrun string's pre-allocated memory.

In general, if you have a std::wstring of length L , you can access characters from index 0 to (L-1) .
Overwriting the terminating '\\0' (located at index L ) is undefined behavior (in practice, it's OK on Visual C++, at least with VC9/VS2008 and VC10/VS2010).

If the string has not the proper size (ie it's not big enough for your needs), then you can call std::wstring::resize() to make room for new characters (ie resizing internal std::wstring 's buffer), and then use &wstr[0] to read-write std::wstring 's content.

If the string is already the proper length and will not need to be changed, you can get a non-const pointer by taking a pointer to the first character:

WCHAR * wpProcToSearch = &wstrProcToSearch[0];

This is guaranteed to work in C++11 and there are no known implementations of C++03 where it doesn't.

If you only need a const pointer you should use c_str :

const WCHAR * wpProcToSearch = wstrProcToSearch.c_str();

I think you can use

wpProcToSearch = wstrProcToSearch.c_str()

like you do with a normal std::string.

I recommend this approach:

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

It is quite simple but you can not change the length of the string at all. So moving "\\0" might not be valid...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM