从 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();
这可能是一个简单的问题,但我在 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();