【问题标题】:C++ Converting string to wchar_tC++ 将字符串转换为 wchar_t
【发布时间】:2014-05-21 20:01:25
【问题描述】:

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

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

有什么想法可以更快地进行转换吗? (最奇怪的是它只发生在随机的特定字符串中,即“Two”有效,“Two Two”无效,“Two Too”有效。

更新

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();

【问题讨论】:

  • 澄清一下,stringToWideChar 返回一个指向局部变量wideString 拥有的缓冲区的指针,该缓冲区在方法退出时被破坏。

标签: c++ typeconverter


【解决方案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 行仍然有效。

【讨论】:

    【解决方案2】:

    在您更新的代码中,您的 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));
    }
    

    确保预先分配你的 buf,用 0 填充它(以获得 0 终止)等。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 刚刚做了,又一次,出于某种原因,它仍然在做同样的事情。在第一篇文章中更新了代码。在我的 convert:: 类之外测试了函数。它做同样的事情。最初的平局(最开始)会画出奇怪的人物。之后的所有绘图,它都显示得很好......
      猜你喜欢
      • 2011-02-03
      • 1970-01-01
      • 2018-09-02
      • 2014-11-12
      • 2012-09-03
      • 2015-02-27
      • 2012-03-30
      • 1970-01-01
      相关资源
      最近更新 更多