我有一个真正古老的打孔卡格式和使用
sscanf
读取它的C++代码,如下所示,
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
的 cardnum
,接下来的五个字符包含读入 int
的 satrec.satnum
,依此类推。 (特定年龄的人会认为这是 Hollerith 格式。)字符串 longstr1
中字符的位置永远不会改变。
这工作得很好,但我必须让它在 Linux 上的
gcc
和 Windows 上的 Visual Studio C++ (2017) 上都能工作。 VS 抱怨 sscanf
不安全(我想是这样),并建议将其替换为 sscanf_s
(微软独有的功能)。 我需要一个让 VS 满意的替代品,但也可以在 Linux 上使用 gcc
进行编译。
有没有一些安全且简单的方法来实现这一点?
如果您在 Windows 上定义
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
,则每当您编写 sscanf_s
时,它都会使用 sscanf
。这意味着在 Linux 上,代码仍然按原样工作,在 Windows 上,该功能会自动为您替换为安全版本,但不再生成任何警告,因此两个平台都应该满意。
请参阅 Microsoft 文档网站上的安全模板重载,了解更多信息:
如果将 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 定义为 1,它将启用标准 CRT 函数的模板重载,自动调用更安全的变体。如果 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 为 1,则无需更改代码。