如何将字符串或整数添加到可变 printf 函数?
How to prepend a string or integer to a variadic printf function?
我有一个调试函数,它采用格式和可变数量的附加参数(就像 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:
这样的 header 这样如果我调用 debug_printf("test1")
结果将打印 DBG: test1
.
或者,我如何修改此函数采用可变整数(函数的 return 值)并以某种方式将其作为字符串添加到结果输出中?例如,如果我有一个函数 rng()
returned 一个随机整数,我可能会调用 debug_printf("test2")
并且结果会打印类似 3572 test2
的东西,假设 rng()
returned 整数值 3572
.
对于这两种情况,理想情况下,解决方案将修改 debug_printf()
的 body 而不是将其包装在另一个函数 and/or 预处理器宏中。
EDIT:看来我忘记了重要的一点。出于性能原因,我非常希望只在 debug_printf()
中调用 actual_printf()
一次 。否则是的,调用它两次将是一个相当简单的解决方案:一次使用 header ,一次使用实际格式化的字符串。抱歉!
无需寻找复杂的方法在可变参数列表中插入另一个参数,您只需在代码的开头添加一个简单的 printf:
printf("%d ",rng());
打印到 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():
分配
我有一个调试函数,它采用格式和可变数量的附加参数(就像 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:
这样的 header 这样如果我调用 debug_printf("test1")
结果将打印 DBG: test1
.
或者,我如何修改此函数采用可变整数(函数的 return 值)并以某种方式将其作为字符串添加到结果输出中?例如,如果我有一个函数 rng()
returned 一个随机整数,我可能会调用 debug_printf("test2")
并且结果会打印类似 3572 test2
的东西,假设 rng()
returned 整数值 3572
.
对于这两种情况,理想情况下,解决方案将修改 debug_printf()
的 body 而不是将其包装在另一个函数 and/or 预处理器宏中。
EDIT:看来我忘记了重要的一点。出于性能原因,我非常希望只在 debug_printf()
中调用 actual_printf()
一次 。否则是的,调用它两次将是一个相当简单的解决方案:一次使用 header ,一次使用实际格式化的字符串。抱歉!
无需寻找复杂的方法在可变参数列表中插入另一个参数,您只需在代码的开头添加一个简单的 printf:
printf("%d ",rng());
打印到 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():
分配