2

很抱歉,这是一个非常循环的问题,但这里的大部分帮助都没有帮助。我的问题是我希望能够在我的 Win 32 应用程序中显示整数,但显然它们需要采用某种格式才能打印(我相信是 LPCWSTR)。所以我尝试了这个:

LPCWSTR intToString(int i){
    TCHAR buf[32];
    _itow_s(i, buf, 10);
    return buf;
}

但是当我使用它打印它时

TextOut(hdcBuffer, 30, 40, intToString(xValue), 32);

它在屏幕上打印了许多随机字符,就像试图在记事本中打开一个实际上不应该在此处打开的文件一样。(所以使用随机方块、线条、& 符号等)我尝试过 sprintf() 之类的东西以及其他一些我不记得的东西。请不要建议下载新库或任何东西,因为我不想这样做,特别是,除非这是唯一的方法。

再次对这种重复感到抱歉,但其他页面上的解决方案似乎不起作用。我在 Windows 7 计算机上使用 Visual Studio 2012。如果您需要更多信息,请说出来,我将尽我所能合作。

谢谢 :)

4

3 回答 3

3
#include <sstream>

template<typename U>
std::wstring towstring(const U& val)
{
    std::wstringstream ss;
    ss << val;
    return ss.str();
}

稍后在代码中:

TextOut(hdcBuffer, 30, 40, towstring(xValue).c_str(), 32);
于 2013-07-06T21:45:55.093 回答
0

intToString它返回指向局部变量的指针的函数。一旦函数返回buf不再存在并尝试引用它曾经占用的内存,就会导致未定义的行为。这意味着有时它可能会起作用,而有时它可能不起作用,但没有任何保证。

您可以通过将缓冲区传递给intToString并返回指向它的指针来使其工作。

template<int size>
const wchar_t* intToString(int i, wchar_t (&buf)[size])
{
    _itow_s<size>(i, buf, 10);
    return buf;
}

TCHAR buf[20];
TextOut(hdcBuffer, 30, 40, intToString(xValue, buf), 32);
于 2013-07-06T20:54:47.610 回答
-6

您的缓冲区是分配在堆栈上的临时变量,当intToString函数返回时将消失。

尝试:

LPCWSTR intToString(int i){
    static TCHAR buf[32];
    _itow_s(i, buf, 10);
    return buf;
}
于 2013-07-06T20:53:41.083 回答