如何通过可变数量的参数对printf / sprintf的 [英] How to pass variable number of arguments to printf/sprintf
问题描述
我有一个保存了错误功能,将格式化一些文本类。我想接受可变数量的参数,然后用printf格式化。
示例:
MyClass类
{
上市:
无效错误(为const char *格式,...);
};
的错误方法应采取的参数,调用printf / sprintf的格式化,然后用它做什么。我不想写所有的格式化自己,所以是有意义的尝试,并找出如何利用现有的格式。
坏
无效错误(为const char *格式,...)
{
焦炭DEST [1024 * 16];
va_list的argptr;
的va_start(argptr,格式);
vsprintf中(DEST,格式,argptr);
va_end用来(argptr);
的printf(DEST);
}
这code不是那么好。它使用一个固定大小的字符缓冲区可导致缓冲区溢出错误,如果字符串是病理长。对任意大 1024 * 16
尺寸应掀起一个标志在你的头上。此外,如果 DEST
结束了含有格式codeS的的printf
通话可能会遇到的问题。更好的是的printf(%S,DEST)
。但更重要的仍然是使用 vprintf
或 vfprintf
:
好
无效错误(为const char *格式,...)
{
va_list的argptr;
的va_start(argptr,格式);
vfprintf(标准错误,格式,argptr);
va_end用来(argptr);
}
如果你想操作字符串您显示之前和真的需要它存储在缓冲区第一,请请请使用 vsnprintf
而不是 vsprintf中
。 vsnprintf
将prevent意外缓冲区溢出错误。
I have a class that holds an "error" function that will format some text. I want to accept a variable number of arguments and then format them using printf.
Example:
class MyClass
{
public:
void Error(const char* format, ...);
};
The Error method should take in the parameters, call printf/sprintf to format it and then do something with it. I don't want to write all the formatting myself so it makes sense to try and figure out how to use the existing formatting.
Bad
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);
}
This code is not so good. It uses a fixed-size character buffer which can lead to a buffer overrun error if the string is pathologically long. The arbitrary large 1024*16
size should set off a flag in your head. Also, the printf
call could run into problems if dest
ends up containing formatting codes. Better would be printf("%s", dest)
. But even better still would be using vprintf
or vfprintf
:
Good
void Error(const char* format, ...)
{
va_list argptr;
va_start(argptr, format);
vfprintf(stderr, format, argptr);
va_end(argptr);
}
If you want to manipulate the string before you display it and really do need it stored in a buffer first, please please please use vsnprintf
instead of vsprintf
. vsnprintf
will prevent an accidental buffer overflow error.
这篇关于如何通过可变数量的参数对printf / sprintf的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!