我正在尝试使用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/