fscanf使用宏修复字符串大小

时间:2012-09-26 18:11:34

标签: string gcc macros scanf

我想使用fscanf(使用gcc的C代码)从文件解析ip。 所以,我想这样做:

char myip[INET_ADDRSTRLEN];
fscanf(file, "%16s", myip);

但是,我不想硬编码16,所以我试图使用宏,但它不起作用。

#define _STRIFY(x) #x
char myip[INET_ADDRSTRLEN];
fscanf(file, "%" _STRIFY(INET_ADDRSTRLEN) "s", myip);

这是我得到的错误

unknown conversion character type 'N' format

所以我的代码出了什么问题?

感谢您的帮助:)

2 个答案:

答案 0 :(得分:4)

这个怎么样?

char format[14];
sprintf(format, "%%%ds", INET_ADDRSTRLEN-1);
fscanf(file, format, myip);

答案 1 :(得分:2)

使用此:

#define stringify_1(x...)  #x
#define stringify(x...)    stringify_1(x)

char myip[INET_ADDRSTRLEN];
fscanf(file, "%" stringify(INET_ADDRSTRLEN) "s", myip);

这些是Linux内核中使用的stringify函数式宏。

如果您对缓冲区大小和转换规范中的大小使用相同的值,则在我的注释中看到您容易受到缓冲区溢出的影响。在缓冲区声明中使用例如INET_ADDRSTRLEN + 1以避免溢出的可能性。