簡體   English   中英

如何從int轉換為wchar_t *?

[英]How to convert from int to wchar_t*?

我這樣做是這樣的:

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;
}

而且有效,但是我只能得到任何數字的第一位數字,而不是整數。 如何正確地做到這一點?

嘗試這個:

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]在堆上分配內存。

另外,我僅用10替換了sizeof(result) / sizeof(*result) 不幸的是,您無法在C ++中測量陣列容量:)

您還可以使用wchar_t* result = (wchar_t*)malloc(sizeof(wchar_t) * 10); 而不是我的wchar_t *result = new wchar_t[10]; -我的解決方案只有一點點明確,但確實如此。

考慮使用字符串流和按時間順序的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。 希望它接近您所使用的。 這樣做的主要好處是庫可以為您處理所有的內存管理,轉換等工作,而您幾乎不需要動手。

在第一種情況下,您將返回一個指向堆棧上緩沖區的指針,該緩沖區將在函數返回時銷毀。 在第二種情況下,您將分配由調用者負責的內存。

嘗試這個:

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();
}

您正在將result視為一串字符,這自然是可以想到的。 但是,嚴格來說, result不是字符串,而是僅初始字符的地址 因此, sizeof(result)不能滿足您的要求。 嘗試使用wcslen()wcsnlen()盡管,實際上,您可能更喜歡做的是學習C ++風格的字符串。

關於Convert1() ,您是對的: result是一個本地數組,該數組分配在堆棧上,並在其函數返回時釋放。

順便說一句,您的Convert2()可能會泄漏內存,具體取決於其調用者如何處理它。 由於這個原因,您可能更希望它返回一個std::shared_ptr或更佳的是std::unique_ptr ,而不是一個普通的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM