正在强制sscanf返回多个已满足的参数

Forcing sscanf to return more than number of arguments satisfied

本文关键字:满足 参数 返回 sscanf      更新时间:2023-10-16

我的软件验证小组正在测试一段代码,如下所示:

unsigned int alarm_id;  
char         alarm_text[16];  
static const char text_string[] = "105, Water_Boiling";  
signed int   arguments_satisfied =  
    sscanf(text_string,  
           "%3d, %16s",
           &alarm_id, &alarm_text[0]);
if (arguments_satisfied < 2)
{
   system_failure();
}

使用上面的代码片段,有没有一种方法可以让sscanf返回大于2的值,而不更改格式说明符或将参数更改为sscanf

他们正在使用单元测试工具练习if语句表达式。

对于C++,当编译为C++时,与上面的片段有什么不同吗
(我们计划使用相同的代码,但编译为C++。)

仅供参考,我们使用的是带有IAR嵌入式工作台的ARM7处理器。

sscanf返回转换的参数数。它无法转换比你告诉它的更多的论点。因此,除非更改格式字符串,否则sscanf不能返回大于2的值。一个可能的例外——如果在转换第一个参数之前用完了数据,则可能会返回EOF,但我怀疑这只适用于scanf,而不适用于sscanf。

对于许多工具链(我很确定IAR是一个),如果在对象文件和库中有一个符号,链接器将链接到对象文件中的符号,而不是库中的符号。

因此,您可以在测试期间提供自己的sscanf()函数来链接,并让它返回您喜欢的任何内容。

如果链接器在您的sscanf()实现和库中的实现之间存在符号冲突问题,那么另一种可行的方法是让您使用不同的名称(如unittest_sscanf)对sscanf()进行单元测试,并让构建系统定义一个宏,以便在构建过程中使用类似于/Dsscanf=unittest_sscanf的方法为被测模块重命名sscanf()

当然,要确保其他未经过测试的sscanf()调用不会引起问题可能会很棘手。