就像斯特凡说的那样,但为了sscanf()
更恰当地回答这个问题,还有更多的宏观诡计:
#define MACRO_SIZE 5 #define FORMAT(S) "%" #S "s" #define RESOLVE(S) FORMAT(S) char buf[MACRO_SIZE + 1]; sscanf(input_str, RESOLVE(MACRO_SIZE), buf);
这使用C自动连接相邻的字符串文字,在编译时形成所需的格式字符串.这仅适用MACRO_SIZE
于预处理器宏,而不是它是正常的运行时变量.
RESOLVE()
需要额外的宏调用,因为否则参数将不会被解析为其#define
d值,并且我们最终会得到格式化字符串"%MACRO_SIZEs"
,这不是我们想要的.
就像斯特凡说的那样,但为了sscanf()
更恰当地回答这个问题,还有更多的宏观诡计:
#define MACRO_SIZE 5 #define FORMAT(S) "%" #S "s" #define RESOLVE(S) FORMAT(S) char buf[MACRO_SIZE + 1]; sscanf(input_str, RESOLVE(MACRO_SIZE), buf);
这使用C自动连接相邻的字符串文字,在编译时形成所需的格式字符串.这仅适用MACRO_SIZE
于预处理器宏,而不是它是正常的运行时变量.
RESOLVE()
需要额外的宏调用,因为否则参数将不会被解析为其#define
d值,并且我们最终会得到格式化字符串"%MACRO_SIZEs"
,这不是我们想要的.
如果你的MACRO_SIZE在编译时是const,你可以试试这个:
#define MACRO_SIZE "5" snprintf(fmt_str, 100, "%" MACRO_SIZE "s", buf);