如何在sscanf中传递可变长度宽度说明符?

Ama*_*ain 13 c

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",这不是我们想要的.


Ste*_*fan 8

如果你的MACRO_SIZE在编译时是const,你可以试试这个:

#define MACRO_SIZE "5"
snprintf(fmt_str, 100, "%" MACRO_SIZE "s", buf);
Run Code Online (Sandbox Code Playgroud)