sscanf 的替代方案,让 Linux 和 Windows 都满意

问题描述 投票:0回答:1

我有一个真正古老的打孔卡格式和使用

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
进行编译。

有没有一些安全且简单的方法来实现这一点?

c++ visual-studio security gcc
1个回答
3
投票

如果您在 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,则无需更改代码。

© www.soinside.com 2019 - 2024. All rights reserved.