gpt4 book ai didi

c++ - swprintf 意外结果

转载 作者:太空宇宙 更新时间:2023-11-04 08:39:03 25 4
gpt4 key购买 nike

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

WCHAR buffer[256];

LPCWSTR pszFormat = L"%s %d";

WCHAR* pszTxt = dataPath.Buffer;//*

status = RtlStringCbPrintfW(buffer, sizeof(buffer), pszFormat, pszTxt, 1);
  • 这里的dataPath是UNICODE_STRING .所以dataPath.Buffer是PWCH
    在这里看到缓冲区值为:buffer = wchar_t [168] "\Device\HarddiskVolume2\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"

那么原因是什么,null terminated char?不应该使用 swprintf 自动正确处理吗?

最佳答案

您链接到的 UNICODE_STRING 文档指出 Buffer 不一定以 null 结尾,%s 格式需要一个 null-终止字符串。

您可以通过指定精度来限制用 %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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com