C++ C++;将字符串转换为wchar\t

C++ C++;将字符串转换为wchar\t,c++,typeconverter,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

我刚开始使用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();

}

背景是文本最初的绘制方式。“0级”是最初应该绘制的。(在屏幕截图中,初始文本按原样褪色。)

有没有办法加快转换速度?(最奇怪的是,它只发生在随机特定的字符串中,即“两个”起作用,“两个”不起作用,“两个”也起作用

已更新

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

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

return wideString;
}

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

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行仍然有效。

在更新的代码中,c_str()调用将返回指向临时对象(右值)的指针,该对象在分号处被破坏

你需要这样的东西:

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));
}
void stringToWideChar(字符串,字符*目的地){
wstring宽管柱;
对于(int i=0;i

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

为了澄清,
stringToWideChar
返回一个指针,指向局部变量
wideString
拥有的缓冲区,该缓冲区在方法退出时被销毁。只是出于某种原因,它仍然在做完全相同的事情。在第一篇文章中更新了代码。在我的convert::class之外测试了该函数。它也做了完全相同的事情事情。最初的画(第一个)画的是奇怪的人物。之后的所有画,都显示得很好。。。
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);
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));
}