2

我想使用 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

那么我的代码有什么问题?

感谢您的帮助 :)

4

2 回答 2

4

这个怎么样?

char format[14];
sprintf(format, "%%%ds", INET_ADDRSTRLEN-1);
fscanf(file, format, myip);
于 2012-09-26T18:18:00.453 回答
2

用这个:

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

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

这些是 Linux 内核中使用的类似字符串化函数的宏。

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

于 2012-09-26T18:17:45.187 回答