让我们看一下这行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!

这是预期的行为吗?

最佳答案

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

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


在第二种情况下,由于缺少详细信息,编译器认为您可以传递任何格式说明符,因此整个scanf()转换集都必须包含在代码中。

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

关于c - sscanf,文字或指针格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20237613/

10-10 14:35