c – 如何传递可变数量的参数到printf / sprintf

我有一个类,它持有一个“错误”函数,将格式化一些文本。我想接受可变数量的参数,然后使用printf格式化它们。

例:

class MyClass
{
public:
    void Error(const char* format, ...);
};

Error方法应该接受参数,调用printf / sprintf格式化它,然后用它做一些事情。我不想自己写所有的格式化,所以尝试和弄清如何使用现有的格式是有意义的。

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);
}

这段代码不是那么好。它使用固定大小的字符缓冲区,如果字符串在病理上较长,可能导致缓冲区溢出错误。任意大的1024 * 16大小应该在你的头上标出一个标志。此外,如果dest结束包含格式化代码,printf调用可能会遇到问题。更好的是printf(“%s”,dest)。但更好的还是会使用vprintf或vfprintf:

void Error(const char* format, ...)
{
    va_list argptr;
    va_start(argptr, format);
    vfprintf(stderr, format, argptr);
    va_end(argptr);
}

如果你想在显示它之前操作字符串,真的需要它存储在缓冲区中,请使用vsnprintf而不是vsprintf。 vsnprintf将防止意外的缓冲区溢出错误。

http://stackoverflow.com/questions/1056411/how-to-pass-variable-number-of-arguments-to-printf-sprintf

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 如何传递可变数量的参数到printf / sprintf