Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert std::wstring to WCHAR*

Tags:

c++

string

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?

like image 523
Jona Avatar asked Apr 19 '13 20:04

Jona


People also ask

How do I convert Wstring to Wchar?

There is no way to convert wstring to wchar_t* but you can convert it to const wchar_t* which is what answer by K. Kirsz says. This is by design because you can access a const pointer but you shouldn't manipulate the pointer.

How do you convert Wstring to Lpcwstr?

This LPCWSTR is Microsoft defined. So to use them we have to include Windows. h header file into our program. To convert std::wstring to wide character array type string, we can use the function called c_str() to make it C like string and point to wide character string.

How do I convert Wstring to CString?

The easiest solution is to use Unicode string literals and std::wstring: wstring z = L"nüşabə"; CString cs(z. c_str()); nameData. SetWindowTextW(cs);

What is Wstring?

Wide string. String class for wide characters. This is an instantiation of the basic_string class template that uses wchar_t as the character type, with its default char_traits and allocator types (see basic_string for more info on the template).


2 Answers

If you want to convert from std::wstring to const WCHAR* (i.e. 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).

Before C++17, overwriting the terminating '\0' (located at index L) was undefined behavior (in practice, it's been OK on Visual C++, at least with VC9/VS2008 and VC10/VS2010).

Starting with C++17, overwriting the terminating NUL ('\0') with another NUL has been made valid and is no more undefined behavior.

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

like image 134
Mr.C64 Avatar answered Oct 01 '22 04:10

Mr.C64


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();
like image 23
Mark Ransom Avatar answered Oct 01 '22 03:10

Mark Ransom