如何从int转换为wchar_t *?

时间:2013-07-11 15:52:15

标签: c++

我是这样做的:

static wchar_t* Convert1(tDWORD data) 
{
  wchar_t result[10];
  swprintf(result, sizeof(result) / sizeof(*result), L"%d", data);
  wprintf(L"[%ls]\n", result);
  return result;
}

它没有用,我猜是因为堆栈内存在返回后已被清除(有人可以向我解释原因吗?)。然后我试着这样:

static wchar_t* Convert2(tDWORD data) 
{
  wchar_t* result = (wchar_t*)malloc(sizeof(wchar_t) * 10);
  swprintf(result, sizeof(result) / sizeof(*result), L"%d", data);
  wprintf(L"[%ls]\n", result);
  return result;
}

它有效,但我只得到任何数字的第一个数字,而不是整数。如何以正确的方式做到这一点?

4 个答案:

答案 0 :(得分:4)

试试这个:

static wchar_t* Convert1(tDWORD data) 
{
  wchar_t *result = new wchar_t[10];
  swprintf(result, 10, L"%d", data);
  wprintf(L"[%ls]\n", result);
  return result;
}

您尝试返回局部变量(数组)的地址 - 返回其范围后会清除局部变量。这就是为什么你说内存被清除了。另外,像这样分配内存:wchar_t result[10]是在堆栈上分配内存。像这样分配:new wchar_t[10]正在堆上分配内存。

另外,我用sizeof(result) / sizeof(*result)替换了10。不幸的是,您无法在C ++中测量数组容量:)

您也可以使用wchar_t* result = (wchar_t*)malloc(sizeof(wchar_t) * 10);代替wchar_t *result = new wchar_t[10]; - 我的解决方案有点明确,但也是如此。

答案 1 :(得分:3)

考虑使用字符串流和by-val wstring,例如:

#include <iostream>
#include <sstream>
#include <string>
#include <cstdint>
using namespace std;

typedef uint32_t tDWORD;

static std::wstring Convert1(tDWORD data)
{
    std::wostringstream os;
    os << data;
    return os.str();
}

int main(int argc, char *argv[])
{
    tDWORD dwTest = 1024;
    std::wstring res = Convert1(dwTest);
    std::wcout << res << std::endl;
    return EXIT_SUCCESS;
}

<强>输出

1024

抱歉,我不得不伪造typedef。希望它接近你所使用的。这样做的主要好处是所有内存管理,转换等都由图书馆为您处理,不得不亲自手动滚动。

答案 2 :(得分:2)

在第一种情况下,您将返回指向堆栈上缓冲区的指针,该函数将在函数返回时被销毁。在第二种情况下,您将分配调用者必须负责的内存。

试试这个:

static std::wstring Convert1(DWORD data) 
{
  const size_t bufferSize = 10;
  wchar_t result[bufferSize];
  swprintf(result, bufferSize, L"%d", data);
  return result;
}

或更多C ++方法......:

static std::wstring Convert1(DWORD data) 
{
  std::wostringstream stream;
  stream << data;
  return stream.c_str();
}

答案 3 :(得分:1)

您正在考虑将result视为一串字符,这是一种自然而然的思考方式。但是,严重地说,result不是字符串,而是仅初始字符的地址。因此,sizeof(result)并不符合您的想法。试试wcslen()wcsnlen() - 但是,您可能更喜欢做的是学习C ++风格的字符串。

关于Convert1(),你是对的:result是一个本地数组,在堆栈上分配,在函数返回时解除分配。

顺便说一句,你的Convert2()可能会泄漏内存,具体取决于其调用者如何处理内存。出于这个原因,您可能更愿意让它返回std::shared_ptr或更好的std::unique_ptr,而不是普通指针。