[英]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.