c++ - 省略号函数参数的字节大小

标签 c++ c printf variadic-functions

我有一个功能:

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/

相关文章:

c++ - typedef 相对于派生类的优势?

c++ - 在 Objective C++ 中加载 Nib 和显示窗口

OpenACC 的 C/预处理器标准宏?

Char 与 int 调用约定

c - 当管道就位并覆盖了 stdout 和 stderr 时,printf 去哪里了?

C++错误: passing ‘const umap_int {aka const std::unordered_map<int, int>}’ as ‘this’ argument discards qualifiers [-fpermissive]

c++ - WinMain 编译,但 wWinMain 不在 CodeBlocks

c - 为什么编译器不报告缺少分号?

c - C 中的 snprintf() 不单独处理目标字符串的最低两个字节

c - 带尾随空格的固定长度填充