当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在sscanf中传递可变长度宽度说明符?》经验,为你挑选了2个好方法。

就像斯特凡说的那样,但为了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()需要额外的宏调用,因为否则参数将不会被解析为其#defined值,并且我们最终会得到格式化字符串"%MACRO_SIZEs",这不是我们想要的.



1> unwind..:

就像斯特凡说的那样,但为了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()需要额外的宏调用,因为否则参数将不会被解析为其#defined值,并且我们最终会得到格式化字符串"%MACRO_SIZEs",这不是我们想要的.



2> Stefan..:

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

#define MACRO_SIZE "5"
snprintf(fmt_str, 100, "%" MACRO_SIZE "s", buf);

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有