与sscanf_s的混淆

与sscanf_s的混淆,c,C,我对sscanf_s有问题,基本上我有以下代码行: sscanf_s( line.c_str(), "<float_array id=\"%*s[^\"]\" count=\"%*d\">%[^<]s", numString); sscanf_s(line.c_str(), “并将其传递给另一个函数,但是numString在通过等式后仍保留值”,因此导致后续函数失败。如果有人能让我深入了解为什么会发生这种情况,我将不胜感激 我测试过的一

我对sscanf_s有问题,基本上我有以下代码行:

sscanf_s( line.c_str(),
          "<float_array id=\"%*s[^\"]\" count=\"%*d\">%[^<]s",
          numString);
sscanf_s(line.c_str(),
“
并将其传递给另一个函数,但是
numString
在通过等式后仍保留值
,因此导致后续函数失败。如果有人能让我深入了解为什么会发生这种情况,我将不胜感激


我测试过的一个简短的SSCCE发现问题出在其他地方,我将不得不对此进行进一步调查-很抱歉浪费了您的时间,感谢您花时间尝试并帮助我。

函数
sscanf\u s
是微软的一项发明,旨在“更安全”“比标准的
sscanf
功能

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

不幸的是,这对于函数的用户(比如你自己)来说并不是很明显,这导致了函数的频繁误用(这在一定程度上降低了隐含的“安全性”)

;请参阅“备注”一节

因此,这里的行为是未定义的,因为
sscanf\u s
尝试从堆栈中读取一个未放入的整数。幸运的是,读取的内存显然为零,因此将零字节写入
numString

这应该很好:

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

什么类型是代码> NoString ?你能给出一个提示吗?ScScFifs是C,因此你的问题可能会被更好地重新表述成C问题,除非某些C++特定的东西是问题的一部分。NUBString只是一个字符串变量(使用STD::String)我对C++的问题表示歉意,我使用C++,在C中没有经验,所以不知道这是C函数,在格式字符串结尾的 S/<代码>是文字>代码> S/< >,不是扫描集符号的一部分。幸运的是,没有办法告诉你它在In中没有匹配。put string.Minor:“如果您使用的是
%s”
%c”
“还应该包括
“%[”
@chux:实际上它是“类型字段字符c、c、s、s或包含在[]中的字符串控制集”。我自己从来没有使用过[],所以我错误地认为说明符实际上是
“%[]s”
。这就引出了OP代码的另一个问题:尾随的
“s”
是错误的。确实,格式更好,因为
“我尝试了您建议的编辑(使用更大的数字,因为这个系统应该适用于长字符串和短字符串)我仍然遇到同样的问题,除了现在的
numString
等于
“ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ…”。。。“
在函数之后fires@user2289437:更新您的问题,包括a会很好。可能会解释得更多一些。OP的代码中有一个额外的
s
。OP还需要指定缓冲区大小。
size_t BUFSIZE = 50;
char numString[ BUFSIZE ];
sscanf_s( line.c_str(),
          "<float_array id=\"%*s[^\"]\" count=\"%*d\">%[^<]s",
          numString, BUFSIZE );
char numString[ 256 ];
sscanf_s( line.c_str(),
          "<float_array id=\"%*[^\"]\" count=\"%*d\">%255[^<]",
          numString, 256);