将std :: wstring转换为WCHAR *

时间:2013-04-19 20:50:15

标签: c++ string

我不知道如何将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*

有谁知道如何做到这一点?

4 个答案:

答案 0 :(得分:24)

如果您想从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](其中wstrstd::wstring的非空实例)来访问std::wstring的内容(从其第一个字符的地址开始,以及注意字符是连续存储在内存中的,但是你必须注意不要超出字符串的预分配内存。

通常,如果您的std::wstring长度为L,则可以访问索引0中的字符 至(L-1) Overwriting the terminating '\0'(位于索引L)是未定义的行为(实际上,它在Visual C ++上是正常的,至少对于VC9 / VS2008和VC10 / VS2010而言)。

如果字符串的大小不合适(即它不足以满足您的需要),那么您可以调用std::wstring::resize()为新字符腾出空间(即调整内部std::wstring缓冲区的大小) ,然后使用&wstr[0]来读写std::wstring的内容。

答案 1 :(得分:16)

如果字符串已经是正确的长度并且不需要更改,则可以通过获取指向第一个字符的指针来获取非const指针:

WCHAR * wpProcToSearch = &wstrProcToSearch[0];

这保证在C ++ 11中有效,并且没有C ++ 03的已知实现,但它没有。

如果您只需要一个const指针,则应使用c_str

const WCHAR * wpProcToSearch = wstrProcToSearch.c_str();

答案 2 :(得分:8)

我认为你可以使用

wpProcToSearch = wstrProcToSearch.c_str()

就像使用普通的std :: string。

答案 3 :(得分:1)

我推荐这种方法:

private void button4_Click(object sender, EventArgs e)
        {

            XmlDocument doc = new XmlDocument();

            doc.Load("dati.txt");

            foreach (XmlNode node in doc.SelectNodes("//user"))
            {
                String User = node.SelectSingleNode("name").InnerText;
                String Pass = node.SelectSingleNode("password").InnerText;

                if (User == textBox1.Text && Pass == textBox2.Text)
                {
                    button1.Visible = true;
                    dlt_btn.Visible = true;
                    button3.Visible = true;
                    button3.Visible = true;
                    button5.Visible = true;
                    return;
                }

                else
                {
                    MessageBox.Show("Invalid Username or Password!");
                }
            } 
        }

这很简单,但是您根本无法更改字符串的长度。因此,移动“ \ 0”可能无效...