- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在使用 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/
我只想要不带下划线的字符串。我尝试了下面的一些代码都不起作用: string 是来自另一个函数的 char 指针,它看起来像这样: ""_I_have_1_dog.dat)"" void func1(
sscanf_s 在我的系统上未定义。该定义不包含在我从各种 SDK 获得的任何 stdio.h 文件中。为此,我搜索了我系统上的所有文件。 我有 Microsoft Visual C++ 6.0 什
我像这样使用 sscanf_s: double a = 0; double b = 0; sscanf_s(elements[1].c_str(),"", &a, &b);
我想从看起来像这样的文本字符串中解析整数: "f 1/2/3 4/5/6 7/8/9" 进入: int arr1[3] = { 1, 4, 7 }; int arr2[3] = { 2, 5, 8 }
我在使用 sscanf_s 时遇到问题,基本上我有这行代码: sscanf_s( line.c_str(), "%[^1 1 -1 1 -1 -1 -1 -0.9999998 -1
我编写了一个快速内存读取器类,它模拟与 fread 和 fscanf 相同的功能。 基本上,我使用memcpy 并增加了一个内部指针来读取数据,如fread,但我有一个fscanf_s 调用。我使用了
我想通过函数sscanf_s从字符串中提取文件名License.xml Content-Disposition: form-data; name="file"; filename="C:\share\
此行为似乎在 Visual Studio 2012 和 2015 之间发生了变化。 int i,j; sscanf_s("1†3", "%d†%d", &i, &j); 在上面的代码中,j 没有被设置
char a[200] = { 0 }; char tst[20] = "aaaa 123\n"; int i; sscanf_s(tst, "%s %d",a, &i); printf("reasu
我不明白为什么我会收到错误消息“变量“tmp”周围的堆栈已损坏”。 我在不同的函数中使用相同的代码并且运行良好,但现在当函数“返回”时它会抛出上述错误。 struct frame { uint8
我不明白为什么下面的代码会失败: char toto[54], titi[54]; //I already tried with allocations sscanf_s(line, "%s-%
我有字符串(45 字节): String1 String2000000000001234 我需要从这个字符串中获取三个变量: char * var1="String1";
result = sscanf_s(line.c_str(), "data (%d,%d)", &a, &b); 在上面的代码中,我使用 sscanf_s 从给定的字符串 line 中提取两个整数值。
UnlockOffset 是 DWORD。 thisKey 是一个 char[5] if(EOF == sscanf_s(thisKey, "%d", &UnlockOffset)) 上面的代码如何在
我正在尝试解析以下字符串 - "DATA,97,103,100,97,84,69"。该字符串可以有以下变体- "DATA,100,10,1,9,82,60" "DATA,57,27,59,30,11,
我正在尝试将仅包含浮点值的 char * 转换为 float 类型,但 sscanf_s 和 atof 都产生相同的无效结果。 char t[] = "2.10"; float aFloat( 0.0
SYSTEMTIME ConvertStringToSystemTime(const char *dateTimeString) const { SYSTEMTIME systime;
我是一名优秀的程序员,十分优秀!