我有一个功能:
static int myprintf(const char* fmt, ...)
我想知道所有 myprintf 参数的字节大小,如果它们被打印到缓冲区。
我需要动态分配一个数组,我可以在其中打印参数(使用 sprinf
或 _vsprinf
)
例如在 32 位操作系统中,for myprintf("%d %c",10,'a');
myprintf 参数的大小是 5。
我试着像这样实现它:
va_list ap;
va_start(ap, fmt);
myArgSize(ap);
有人可以建议如何实现 myArgSize。
我被告知要尝试这样的事情
char c;
int len = ::_vsnprintf(&c, 1, fmt, ap);
它不起作用,因为写入了一个以上的字节。 但可能有一些解决方法。
谢谢
最佳答案
尽管您的大部分问题是关于传递给三元函数的参数的大小,但在我看来,您实际上对输出缓冲区需要多大感兴趣。尝试如下操作:
va_list ap;
va_start(ap, fmt);
int len = ::vsnprintf( NULL, 0, fmt, ap);
if (len < 0) abort();
char* buffer = (char*) malloc( len + 1);
if (!buffer) abort();
::vsnprintf( buffer, len+1, fmt, ap);
va_end();
但是,如果您的平台没有符合 C99 标准的 vsnprintf()
(例如,MSVC),那么您将不得不进行一些调整。对于 MSVC,您可以尝试传入一个大小为猜测的缓冲区(可能是 strlen(fmt)+1 + (10 * number_of_percent_signs_in_fmt)
或只是从应该涵盖 99% 的情况的大小开始 - 也许200
), 并增加猜测直到成功。或者你可以尝试类似 the snprintf()
family of functions by Holger Weiss 的东西.
关于c++ - 省略号函数参数的字节大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10297690/