我有一个类,它包含一个"error“函数,它将格式化一些文本。我希望接受数量可变的参数,然后使用printf对它们进行格式化。
示例:
class MyClass
{
public:
void Error(const char* format, ...);
};
Error方法应该接受参数,调用printf/sprintf对其进行格式化,然后对其执行某些操作。我不想自己编写所有的格式,所以尝试并弄清楚如何使用现有的格式是有意义的。
发布于 2009-06-29 03:22:21
void Error(const char* format, ...)
{
va_list argptr;
va_start(argptr, format);
vfprintf(stderr, format, argptr);
va_end(argptr);
}
如果您希望在显示字符串之前对其进行操作,并且确实需要首先将其存储在缓冲区中,请使用vsnprintf
而不是vsprintf
。vsnprintf
将防止意外的缓冲区溢出错误。
发布于 2009-06-29 03:15:47
看一看vsnprintf,因为它将执行您想要的http://www.cplusplus.com/reference/clibrary/cstdio/vsprintf/
您必须先初始化va_list arg数组,然后再调用它。
来自该链接的示例: /* vsprintf示例*/
#include <stdio.h>
#include <stdarg.h>
void Error (char * format, ...)
{
char buffer[256];
va_list args;
va_start (args, format);
vsnprintf (buffer, 255, format, args);
//do something with the error
va_end (args);
}
发布于 2009-06-29 03:15:52
我应该在堆栈溢出中阅读更多关于现有问题的内容。
C++ Passing Variable Number of Arguments也是一个类似的问题。Mike F有以下解释:
在不知道传递了多少参数的情况下无法调用(例如) printf,除非你想玩一些顽皮的、不可移植的把戏。
通常使用的解决方案是总是提供另一种形式的vararg函数,因此printf有vprintf,它用va_list代替...那个..。版本只是va_list版本的包装器。
这正是我要找的。我执行了一个测试实现,如下所示:
void Error(const char* format, ...)
{
char dest[1024 * 16];
va_list argptr;
va_start(argptr, format);
vsprintf(dest, format, argptr);
va_end(argptr);
printf(dest);
}
https://stackoverflow.com/questions/1056411
复制相似问题