gpt4 book ai didi

与 sscanf_s 混淆

转载 作者:太空狗 更新时间:2023-10-29 16:01:42 25 4
gpt4 key购买 nike

我在使用 sscanf_s 时遇到问题,基本上我有这行代码:

sscanf_s( line.c_str(),
"<float_array id=\"%*s[^\"]\" count=\"%*d\">%[^<]s",
numString);

我正在向它提供这行文本:

<float_array id="Cube-mesh-positions-array" count="24">1 1 -1 1 -1 -1 -1 -0.9999998 -1    -0.9999997 1 -1 1 0.9999995 1 0.9999994 -1.000001 1 -1 -0.9999997 1 -1 1 1</float_array>

我想要实现的是读取 count="24"> 之后写入的数字数组并将其传递给另一个函数,但是 numString 的值仍然为"" 在通过等式后,因此导致后续函数失败。如果有人可以让我深入了解为什么会发生这种情况,我将不胜感激。

我测试过的一个简短的 SSCCE 表明问题出在其他地方,我必须进一步调查这个问题 - 抱歉浪费您的时间,感谢您花时间尝试帮助我。

最佳答案

sscanf_s 函数是 Microsoft 的一项发明,旨在比标准的 sscanf 函数“更安全”。

因此,如果您使用 "%s""%c",它需要两个参数:一个是缓冲区将输入写入,指定缓冲区可用大小的整数,这样长输入字符串就不会导致缓冲区溢出。

不幸的是,这对于该功能的用户(例如您自己)来说并不是那么明显,导致经常误用该功能(这在某种程度上降低了隐含的“安全性”)。

Link to the Microsoft docs ;参见“备注”部分。

所以你这里有未定义的行为,因为 sscanf_s 试图从你没有放一个整数的堆栈中读取一个整数。您最终很幸运,内存读取显然为零,​​因此将零字节写入 numString

这应该做得很好:

size_t BUFSIZE = 50;
char numString[ BUFSIZE ];
sscanf_s( line.c_str(),
"<float_array id=\"%*s[^\"]\" count=\"%*d\">%[^<]s",
numString, BUFSIZE );

请注意,numString 实际上最好 char[]。您的问题最初被标记为 C++;如果 numString 实际上是一个 std::string,请注意您不能将 scanf 系列函数与 std::string< 一起使用 参数。


(对于编辑感到抱歉,前几次弄错了。那个格式字符串有点......;-))

关于与 sscanf_s 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24078746/

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