sscanf的替代品,使Linux和Windows都感到高兴 我有一个真正的古董和C++代码,用 sSCANF读取如下, sscanf(longstr1,"%2d %5ld %1c %10s %2d %12lf %11lf %7lf %2d %7lf %2d %2d %6ld ", &cardnumb,&satrec.satnum,&classification, intldesg, &satrec.epochyr, &satrec.epochdays,&satrec.ndot, &satrec.nddot, &nexp, &satrec.bstar, &ibexp, &numb, &elnum );

sscanf的替代品,使Linux和Windows都感到高兴 我有一个真正的古董和C++代码,用 sSCANF读取如下, sscanf(longstr1,"%2d %5ld %1c %10s %2d %12lf %11lf %7lf %2d %7lf %2d %2d %6ld ", &cardnumb,&satrec.satnum,&classification, intldesg, &satrec.epochyr, &satrec.epochdays,&satrec.ndot, &satrec.nddot, &nexp, &satrec.bstar, &ibexp, &numb, &elnum );,c++,visual-studio,security,gcc,C++,Visual Studio,Security,Gcc,这里,字符串longtr1的前两个字符包含读入cardnum的int,接下来的五个字符包含读入satrec.satnum的int,依此类推。(特定年龄段的人会将其识别为Hollerith格式。)字符串longtr1中字符的位置从未改变 这很好,但是我必须在Windows上和Linux上的VisualStudioC++(2017)上同时使用 GCC < /C>。VS抱怨sscanf不安全(我想是的),并建议将其替换为sscanf\u s,这是微软独有的功能。我需要一个可以让VS满意的替代品,但是在

这里,字符串
longtr1
的前两个字符包含读入
cardnum
int
,接下来的五个字符包含读入
satrec.satnum
int
,依此类推。(特定年龄段的人会将其识别为Hollerith格式。)字符串
longtr1
中字符的位置从未改变

<>这很好,但是我必须在Windows上和Linux上的VisualStudioC++(2017)上同时使用<代码> GCC < /C>。VS抱怨
sscanf
不安全(我想是的),并建议将其替换为
sscanf\u s
,这是微软独有的功能。我需要一个可以让VS满意的替代品,但是在Linux上也可以使用
gcc
进行编译


是否有一些安全且可能简单的方法来实现这一点?

如果您在windows上定义
\u CRT\u secure\u CPP\u重载\u标准\u名称
,它将在您编写sscanf时使用sscanf。这意味着,在Linux上,代码仍能正常工作,在Windows上,该功能会自动替换为安全版本,但不会再生成任何警告,因此这两种平台都应该感到满意。有关详细信息,请参见microsoft文档网站。

当然可以。它是C++代码,不是C++的代码> SCANFFYS 在C11中,而不是在C99中,而不是在C++中。您知道如何使用格式化的提取操作符,<代码>任何理由不忽略或禁用警告,并继续使用<代码> sSCANF?潜在的问题是
“%10s”
可能比相应的缓冲区长,但如果您知道它不长,您就可以了。如果您感觉有妄想症,并且希望确保
sscanf
代码在程序员更改缓冲区大小时自动调整,请将格式更改为
“%*s”
,并传入
…,大小为intldesg-1,intldesg,
。或者,
\ifdef\u MSC\u VER
sscanf\u s(…)
#else
sscanf(…)代码> >词根<代码>,因为这是在C++中使用的,为什么使用<代码> sChanff()/Cuth>?而不是C++样式流I/O?为什么会被否决?任何投了否决票的人或者能够理解为什么的人,请详细说明。我怀疑这不能工作(
sscanf\u s
需要不同的参数)?
sscanf\u s
应该可以在大多数情况下正常工作,因为字符串文本有模板重载。我想可能有一些地方它仍然不起作用,尽管我在使用该定义时还没有遇到任何问题。