20

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?

Mr.C64
  • 41,637
  • 14
  • 86
  • 162
Jona
  • 1,747
  • 2
  • 16
  • 22
  • http://en.cppreference.com/w/cpp/string/basic_string/c_str ... assuming `const WCHAR *` is acceptable. – Drew Dormann Apr 19 '13 at 20:52
  • What's wrong with `const wchat_t*`? What do you want to do with it? And I really hate those Windows types! We don't need `WCHAR`! – David Heffernan Apr 19 '13 at 20:54
  • Do you want to convert to `WCHAR*` or to `const WCHAR*`? i.e. do you want _read-only_ access (`const WCHAR*`) to `std::wstring`'s content, or do you _modify_ it (`WCHAR*`)? – Mr.C64 Apr 19 '13 at 21:23

4 Answers4

28

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.

Mr.C64
  • 41,637
  • 14
  • 86
  • 162
16

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();
Mark Ransom
  • 299,747
  • 42
  • 398
  • 622
8

I think you can use

wpProcToSearch = wstrProcToSearch.c_str()

like you do with a normal std::string.

Eric
  • 19,525
  • 19
  • 84
  • 147
  • thanks, i used wpProcToSearch = (WCHAR *)wstrProcToSearch.c_str() since .c_str() creates a const wchar_t – Jona Apr 19 '13 at 20:55
1

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...