如何基于同一可变参数列表多次调用vsprintf实现自定义格式化函数?
实现自定义多格式对的printf函数
我想要实现一个可以按如下方式调用的函数:
my_printf(int unimportant, "%-10s", "a string", "%5.1f", 1.23, format_string, value_to_format, /* 可能存在更多此类格式-值对 */ (char *) NULL);
已知前提:每个格式字符串最多包含一个%转义序列,目标是借助sprintf系列函数格式化所有值,最终生成类似"a string , 1.2, …"的拼接结果。
我试过几种方法,但都走不通:
- 直接在循环里调用
vsprintf:会破坏可变参数列表指针ap,调用后无法保证ap的有效性 - 用
va_copy复制ap避免破坏原指针:但没法确定如何把原ap移动到下一组格式-值对的位置,这需要解析格式字符串来判断参数类型 - 改用
sprintf:还是得解析格式字符串,为每种参数类型写switch分支
我想知道这个问题的常规解决方案,而且需要可移植的实现,不能依赖GCC的parse_printf_format这类非标准扩展。可选的解决方向包括:
- 被我忽略的关键点
- 不存在可行的可移植方案
- 必须解析格式字符串
- 预处理器技巧
- 经典参考代码
- 调整调用语法
- 其他方案
感谢任何建议。
内容的提问来源于stack exchange,提问作者Mark Dominus
相关产品推荐
相关产品推荐

