1

我正在尝试创建一个sscanf字符串文字以帮助防止 C99 中的缓冲区溢出。目标是这样的:

#define MAX_ARG_LEN   16

char arg[MAX_ARG_LEN] = "";

if (sscanf(arg, "%"(MAX_ARG_LEN-1)"X", &input) > 0)

显而易见的“手动”解决方案类似于:

#define MAX_ARG_LEN   16
#define MAX_ARG_CHARS "15"

char arg[MAX_ARG_LEN] = "";

if (sscanf(arg, "%"MAX_ARG_CHARS"X", &input) > 0)

但是,我希望在给定缓冲区大小为 16 的情况下自动生成“%15X”。此链接几乎适用于我的应用程序:将预处理器令牌转换为字符串,但它不处理 -1。

建议?

4

1 回答 1

7

Kernighan 和 Pike 在他们的(优秀的)著作《编程实践》中讨论了这个问题,并得出结论说,最可靠和最便携的方法是使用sprintf()生成格式字符串。

您可以做的是将宏定义为不包括终端 null 的长度,然后像这样使用它:

#define STR_EVALUATE(x)   #x
#define STRINGIFY(x)      STR_EVALUATE(x)
#define MAX_ARG_LEN 15
char arg[MAX_ARG_LEN+1] = "";

if (sscanf(arg, "%" STRINGIFY(MAX_ARG_LEN) "X", &input) > 0)
    ...

或者您可以将 MAX_ARG_STRLEN 定义为 15 并将 MAX_ARG_LEN 定义为 MAX_ARG_STRLEN+1 并相应地工作。

于 2010-04-29T19:15:23.977 回答