【问题标题】:Using C preprocessor to construct a string literal for scanf?使用 C 预处理器为 scanf 构造字符串文字?
【发布时间】:2011-02-13 23:10:07
【问题描述】:

我正在尝试创建一个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 .

建议?

【问题讨论】:

    标签: c string concatenation scanf c-preprocessor


    【解决方案1】:

    Kernighan 和 Pike 在他们的(优秀的)书籍“The Practice of Programming”中讨论了这个问题,并得出结论认为最可靠和最便携的方法是使用sprintf() 生成格式字符串。

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

    #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 并相应地工作。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2017-02-25
    • 1970-01-01
    相关资源
    最近更新 更多