簡體   English   中英

使用C預處理器為scanf構造字符串文字?

[英]Using C preprocessor to construct a string literal for scanf?

我試圖創建一個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。

有什么建議嗎?

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並相應地工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM