gpt4 book ai didi

c - 使用 C 预处理器为 scanf 构造字符串文字?

转载 作者:太空宇宙 更新时间:2023-11-04 00:42:37 24 4
gpt4 key购买 nike

我正在尝试创建一个 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”。此链接几乎适用于我的应用程序:Convert a preprocessor token to a string但它不处理 -1。

建议?

最佳答案

Kernighan 和 Pike 在他们的(优秀)著作“The Practice of Programming”中讨论了这个问题' 并得出结论,最可靠和可移植的方法是使用 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 并相应地工作。

关于c - 使用 C 预处理器为 scanf 构造字符串文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2740039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com