c - 如何将字符串或整数添加到可变参数 printf 函数?
问题描述
我有一个调试函数,它采用格式和可变数量的附加参数(就像printf()
),将它们转换为存储在缓冲区中的格式化字符串buf
,并将该缓冲区发送到实际打印它的辅助函数:
#include <stdio.h>
#include <stdarg.h>
void debug_printf(const char *fmt, ...)
{
char buf[100];
va_list va;
va_start(va, fmt);
/* Format the string and store it in buf */
vsnprintf(buf, sizeof(buf), fmt, va);
/* Actually print the buf. */
actual_print(buf);
va_end(va);
}
如何修改此函数以将字符串添加到结果输出中?例如,像DBG:
这样的标题,如果我调用debug_printf("test1")
结果将打印DBG: test1
。
或者,我如何修改此函数以获取变量整数(函数的返回值)并以某种方式将其作为字符串添加到结果输出中?例如,如果我有一个rng()
返回随机整数的函数,我可能会调用debug_printf("test2")
它,结果会打印出类似的东西3572 test2
,假设rng()
返回整数值3572
。
对于这两种情况,理想情况下,解决方案将修改的主体,debug_printf()
而不是将其包装在另一个函数和/或预处理器宏中。
编辑:看来我忘记了重要的一点。出于性能原因,我非常希望只actual_printf()
在. debug_printf()
否则是的,调用它两次将是一个相当简单的解决方案:一次使用标题,再次使用实际格式化的字符串。对于那个很抱歉!
解决方案
打印到 buf 任何你想添加的东西,就是这样。
#include <stdio.h>
#include <stdarg.h>
void debug_printf(const char *fmt, ...)
{
char buf[100];
va_list va;
va_start(va, fmt);
int n = snprintf(buf, sizeof(buf), "DBG: ");
/* Format the string and store it in buf */
vsnprintf(buf + n, sizeof(buf) - n, fmt, va);
/* Actually print the buf. */
actual_print(buf);
va_end(va);
}
无需使用固定大小。手册页有一个示例来计算要使用 malloc() 分配的缓冲区的正确大小:
推荐阅读
- javascript - 如何为命令 discord.js 将多条消息连续串在一起
- javascript - 我可以帮助理解带有背景图像和渐变过滤器的不断变化的 div 部分并使用单击函数 javascript 来更改它吗?
- javascript - 无法在 Meteor 中读取和解析 XML 文件
- python - 如何随机播放列表而不重复?
- ios - 如何在 Swift 中将 UIImage 转换为 HEIF / HEIC 数据?
- python - 使用 GetSecretValue AWS 机密管理器 API 时出现 InvalidSignatureException
- python - 如何在时间序列数据框中添加新行
- php - 警告:使用未定义的常量 reply_text – 假定为“reply_text”
- r - 如果 2 个特定列 (R) 中有零,则删除行
- javascript - 如何在动态 Antd 表单中默认显示第一项?