我正在使用Visual Studio 2017 C ++。当我使用带有%llx或%llu等规范的printf时,一切都按预期工作。如果我使用相同的格式规范,%llu或%llx,使用wsprintf,我会在缓冲区中获得垃圾,而不是使用printf得到的结果。
我的问题是:有没有办法让wsprintf给出在使用%llx和/或%llu时应该获得的结果?
下面是一个非常简单的控制台程序,演示了printf和wsprintf的不同行为。
#include "stdafx.h"
#include <Windows.h>
#include <inttypes.h>
int main()
{
DWORD64 OffsetHWM = 0x7123456789012345;
WCHAR BufferBytes[256] = { 0 }; // initialized - no junk in there
// the wprintf below works as expected
wprintf(L"from wprintf : %8llX\n", OffsetHWM);
// this call to wsprintf isn't filling the buffer with the expected value
wsprintf(BufferBytes, L"%8llX\n", OffsetHWM);
wprintf(L"from wsprintf: %s\n", BufferBytes); // prints junk
wprintf(L"\n"); // just for neatness
wsprintf(BufferBytes, L"%8" PRIx64 "\n", OffsetHWM);
wprintf(L"from wsprintf: %s\n", BufferBytes);
// this truncates (as expected) the value of OffsetHWM - not useful
wsprintf(BufferBytes, L"%8lx\n", OffsetHWM);
wprintf(L"from wsprintf: %s\n", BufferBytes);
return 0;
}
答案 0 :(得分:-1)
wprintf()不应再使用,它是Windows特定的函数,它调用 wsprintfA()或 wsprintfW()进行实际工作,两者在其Windows Dev Center文档站点(https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-wsprintfa)上都有以下注意事项:
注意请勿使用。考虑改用以下功能之一: StringCbPrintf,StringCbPrintfEx,StringCchPrintf,或 StringCchPrintfEx 。请参阅安全注意事项。