%llx或%llu不适用于wsprintf?

时间:2018-04-10 18:20:27

标签: visual-c++ printf

我正在使用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;
}

1 个答案:

答案 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 。请参阅安全注意事项。