我想使用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
所以我的代码出了什么问题?
感谢您的帮助:)
答案 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
以避免溢出的可能性。