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

时间:2013-12-13 00:00:36

标签: c++ c scanf format-specifiers

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

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 Embedded Workbench的ARM7处理器。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

如果链接器在sscanf()实现与库中的实现之间存在符号冲突问题,则替代方案可能是单元测试sscanf()使用不同的名称(例如unittest_sscanf)并让构建系统定义一个宏,以便在构建过程中使用类似sscanf()的内容重命名/Dsscanf=unittest_sscanf

当然,确保未测试的其他sscanf()次呼叫不会导致问题可能会非常棘手。