1

这可能是一个简单的问题,但我在 DirectXTDK 中有一个 uint32_t 中的值。我想通过将它与 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();

当尝试显示默认字体无法处理的垃圾字符时,会出现此问题。如果没有 itoa,执行将在 std::wstring s(ws1) 处引发异常。

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

4

2 回答 2

1

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

您必须进行 C 风格的强制转换才能强制更改指针类型,这是一个危险信号;您永远不必这样做,而且当您这样做时,结果通常是错误的。类型系统可以帮助您!

我还担心您选择的缓冲区大小;你知道每秒帧数只有一位吗?空终止符的空间在哪里?

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

更好的是,完全跳过遗留的东西,让自己成为一个不错的std::to_wstring.

于 2019-11-25T18:11:19.963 回答
0

@Lightness Races with 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();
于 2019-11-25T18:49:08.423 回答