sscanf(input_str, "%5s", buf); //reads at max 5 characters from input_str to buf
Run Code Online (Sandbox Code Playgroud)
但我需要使用%MACRO_SIZE而不是%5s
一个简单的解决方案是为它创建一个格式字符串
char fmt_str[100] = "";
snprintf(fmt_str, 100, "%%%ds", MACRO_SIZE);
sscanf(input_str, fmt_str, buf);
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现同样的目标?
unw*_*ind 10
就像斯特凡说的那样,但为了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);
Run Code Online (Sandbox Code Playgroud)
这使用C自动连接相邻的字符串文字,在编译时形成所需的格式字符串.这仅适用MACRO_SIZE于预处理器宏,而不是它是正常的运行时变量.
RESOLVE()需要额外的宏调用,因为否则参数将不会被解析为其#defined值,并且我们最终会得到格式化字符串"%MACRO_SIZEs",这不是我们想要的.
如果你的MACRO_SIZE在编译时是const,你可以试试这个:
#define MACRO_SIZE "5"
snprintf(fmt_str, 100, "%" MACRO_SIZE "s", buf);
Run Code Online (Sandbox Code Playgroud)