我正在尝试使用RtlStringCbPrintfW(swprintf的安全版本),并在将int附加到字符串时获得意外结果。
如果我在int-all工作之后附加相同的字符串。所以我的代码:

WCHAR buffer[256];

    LPCWSTR pszFormat = L"%s %d";

    WCHAR* pszTxt = dataPath.Buffer;//*

    status = RtlStringCbPrintfW(buffer, sizeof(buffer), pszFormat, pszTxt, 1);

这里的数据路径是UNICODE_STRING。所以dataPath.Buffer是PWCH
这里看到的缓冲区值是:buffer=wchar_t[168]“\Device\hardfiskvolume2\foo\Data??C???"
当监视缓冲区数组时,我可以看到“?”是:
0xcc00 '?'
0xcccc '?'

然后在一些字节后,实际目标值1被定位。
dataPath.Buffer的值:
   +0x048 DataPath         : _UNICODE_STRING "\Device\HarddiskVolume2\foo\Data"
      +0x000 Length           : 0x8c
      +0x002 MaximumLength    : 0x8c
      +0x008 Buffer           : 0xffffc000`01cd1d00  "\Device\HarddiskVolume2\foo\Data"

那么什么是reson,以空结尾的char?不应该用swprintf自动正确处理吗?

最佳答案

您链接到的UNICODE_STRING文档声明Buffer不一定以空结尾,%s格式需要以空结尾的字符串。
可以通过指定精度来限制用%s打印的字符串的长度:

WCHAR* pszTxt = dataPath.Buffer;
int Len = dataPath.Length;

RtlStringCbPrintfW(buffer, sizeof(buffer), L"%.*s %d", Len, pszTxt, 1);

关于c++ - swprintf意外结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24651599/

10-09 01:24