C ++将字符串转换为wchar_t

时间:2014-05-21 20:01:25

标签: c++ typeconverter

我刚开始使用GDI +,会有很多转换。

我绘制的文本作为一堆随机符号出现一瞬间。我将问题追溯到转换。

代码在底部更新

const wchar_t* convert::stringToWideChar(string String) {

  wstring wideString;

  for(int i = 0; i < String.length(); i++)
      wideString += wchar_t( String[i] );

  return wideString.c_str();

}

用作:

testing = "Two Two";
const wchar_t* buf = convert::stringToWideChar(testing);
path.AddString(buf, wcslen(buf), &gFontFamily, FontStyleBold, 72, ptOrg, &strFormat);

picture

背景是最初绘制文本的方式。 &#34;等级0&#34;是应该初步绘制的。 (在屏幕截图中,初始文本应该褪色。)

更快地进行转换的想法是什么? (最奇怪的是它只发生在随机的特定字符串上,即&#34;两个&#34;工作,&#34;二个&#34;,没有&#39;&#34;两个太多&#34;,确实

更新

wstring convert::stringToWideChar(string String) {
wstring wideString;

for(int i = 0; i < String.length(); i++)
    wideString += wchar_t(String[i] );

return wideString;
}

用作:

const wchar_t* buf = convert::stringToWideChar("leveljjj").c_str();

3 个答案:

答案 0 :(得分:1)

Re:您的更新代码;

自动变量和临时变量之间的生命周期存在差异。

自动变量在函数中声明,并将持续到范围结束。

临时只会持续到它所属的表达式的结尾。

一个例子;

testing = "Two Two";
const wchar_t* buf = convert::stringToWideChar("leveljjj").c_str();
path.AddString(buf, wcslen(buf), &gFontFamily, FontStyleBold, 72, ptOrg, &strFormat);

在这种情况下,stringToWideChar返回的字符串是临时的。它只会持续到它作为一个部分的表达式完成,直到赋值行结束。它将在path.AddString行之前销毁。

如果你另一方面做了这个;

testing = "Two Two";
std::wstring value = convert::stringToWideChar("leveljjj");
const wchar_t* buf = value.c_str();
path.AddString(buf, wcslen(buf), &gFontFamily, FontStyleBold, 72, ptOrg, &strFormat);

... value是一个自动变量,一直持续到范围结束。这意味着,使用返回的缓冲区是安全的,因为变量对AddString行仍然有效。

答案 1 :(得分:1)

在更新的代码中,c_str()调用将返回一个指向临时对象(rvalue)的指针,该对象在分号处被销毁。

你需要这样的东西:

void stringToWideChar(string String, char* destination) {
    wstring wideString;

    for(int i = 0; i < String.length(); i++)
        wideString += wchar_t(String[i] );

    memcpy(destination, wideString.c_str(), strlen(wideString.c_str));
}

确保预先分配您的buf,填写0(以获得0终止)等。

答案 2 :(得分:0)

如果您更改转换函数以返回wstring,则会删除代码中的悬空引用。