sscanf,文字或指针格式

时间:2013-11-27 08:49:35

标签: c string pointers scanf string-literals

让我们看看这行C代码:

if(sscanf(s, "%04d%02d%02d%02d%02d%02d", &year, &month, &day, &hour, &min, &sec) != EOF) { 
    // ... other stuff
}

我正在使用Microchip C30编译器。 's'和之前定义的其他变量。 我整个代码的大小是:237396字节。

让我们尝试将格式字符串从文字更改为指针:

const char *format = "%04d%02d%02d%02d%02d%02d";
if(sscanf(s, format, &year, &month, &day, &hour, &min, &sec) != EOF) { 
    // ... other stuff
}

现在大小:243798字节!超过6 kB!

这是预期的行为吗?

1 个答案:

答案 0 :(得分:1)

在第一种情况下,编译器知道要使用的sscanf()次转换选择集:字符串到int

sscanf(s, "%04d%02d%02d%02d%02d%02d", ...

在第二种情况下,缺少此细节,编译器认为您可以传递任何格式说明符,因此整个scanf()转换集需要在代码中。

const char *format
sscanf(s, format, ...