sscanf的替代品,使Linux和Windows都满意

时间:2019-02-04 23:30:58

标签: c++ visual-studio security gcc

我有一个真正古老的punch-card format和一个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 );

这里,字符串longstr1的前两个字符包含读入int的{​​{1}},接下来的五个字符包含读入cardnum的{​​{1}},和以此类推。 (一定年龄的人会将其识别为Hollerith格式。)字符串int中字符的位置永远不变。

这很好用,但我必须使其在Linux上的satrec.satnum和Windows上的Visual Studio C ++(2017)上都可以使用。 VS抱怨longstr1是不安全的(我想是的),建议使用Microsoft独有的功能gcc替换它。我需要一个使VS满意的替代品,但也可以在Linux上使用sscanf进行编译。

是否有一些安全的,也许是简单的方法来完成此任务?

1 个答案:

答案 0 :(得分:-1)

如果在Windows上定义_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES,则每次编写sscanf时都会使用sscanf_s。这意味着在Linux上,代码保持原样运行,在Windows上,该功能会自动为您替换为安全版本,但不再生成任何警告,因此两个平台都应该满意。有关更多信息,请参见Microsoft文档网站上的secure template overloads