从 uint32_t 转换为 wchar_t 并存储在 wstring 中时出现访问冲突

Access violation when converting from uint32_t to wchar_t and storing in wstring

这可能是一个简单的问题,但我在 uint32_t 中的 DirectXTDK 中有一个值。我想通过将它与 wchar_t 连接来显示它。

这是我目前所拥有的 -

char buffer[1];
wchar_t* ws1 = (wchar_t *)itoa(m_timer.GetFramesPerSecond(), buffer, 10), * ws2 = L" FPS";
std::wstring s(ws1);
s += std::wstring(ws2);
const wchar_t* fps = s.c_str();

// Draw Text to the screen
m_sprites->Begin();
    m_font->DrawString(m_sprites.get(), L"DirectX Museum Scene", XMFLOAT2(10, 10), Colors::Yellow);
    m_font->DrawString(m_sprites.get(), fps, XMFLOAT2(8, 30), Colors::Yellow);
m_sprites->End();

显示 FPS 时会出现此问题,因为试图显示默认字体无法处理的垃圾字符。如果没有 itoa,执行将在 std::wstring s(ws1).

处抛出异常

如何有效地将 uint32_t 转换为 wchar_t * 以正确显示 FPS?谢谢!

itoa 生成 ASCII 字符串,而不是宽字符串。

您必须投入 C 风格的转换来强制更改指针类型,这是危险信号;你不应该这样做,而且当你这样做时,结果通常是错误的。类型系统可以帮助您!

我也很关心你选择的缓冲区大小;您知道每秒帧数中只有一位数字吗?空终止符的 space 在哪里?

我想你想要 _itow。但是,要解决缓冲区问题,_itow_s 会更好。

更好的是,完全跳过遗留的东西,给自己一个美好的 std::to_wstring

@Lightness 与 Monica 的比赛让我走上了正确的方向:)

转换为 wstring 并按预期工作

//char buffer[11]; // 32 bits, 10 characters + 1 for terminating null character
    std::wstring ws1 = std::to_wstring(m_timer.GetFramesPerSecond());
    std::wstring ws2 = L" FPS";
    std::wstring s(ws1);
    s += std::wstring(ws2);
    const wchar_t* fps = s.c_str();

    // Draw Text to the screen
    m_sprites->Begin();
        m_font->DrawString(m_sprites.get(), L"DirectX Museum Scene", XMFLOAT2(10, 10), Colors::Yellow);
        m_font->DrawString(m_sprites.get(), fps, XMFLOAT2(8, 30), Colors::Yellow);
    m_sprites->End();