省略号函数参数的大小(以字节为单位)
Size in bytes of ellipsis function arguments
我有一个函数:
static int myprintf(const char* fmt, ...)
我想知道所有 myprintf 参数的大小(以字节为单位),如果它们被打印到缓冲区。我需要动态分配一个数组,我可以将参数打印到该数组(使用 sprinf
或 _vsprinf
)例如在 32 位操作系统中,对于 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
),并增加猜测,直到它起作用。或者你可以尝试Holger Weiss的snprintf()
系列函数。
嗯...有关参数类型和顺序的唯一信息在第一个参数中;这就是为什么它是必需的。
对于类似printf()
的函数,您需要单步执行格式化字符串,解析每个%
代码,并添加相应类型的大小。这不会是微不足道的。请记住处理诸如%hd
这样期望short
而不是int
的事情。此外,当值传递给可变参数函数时,也会发生转换。
vasprintf
将所有格式设置到正确大小的缓冲区中,它将分配该缓冲区(并且您必须free
)。
或者,可以使用vsnprintf
来获取printf
打印的字符串的长度:
int n = vsnprintf(NULL, 0, fmt, args);
这是因为如果有足够的空间,它会返回它将打印的字节数。在这种情况下,它无法打印任何内容,但无论如何都会返回数字。
您可以使用 sizeof(type_name) 并使用 for 循环遍历所有参数,type_name是 C 数据类型中的任何一种,如 int、float、long 等。然后添加所有字节,
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 获取嵌套 stl 容器的大小(以字节为单位)
- 常量"C"占用的空间(以字节为单位)
- C++ 中 STL 中迭代器的大小(以字节为单位)是多少
- 有人知道可以使用 c++ 以字节为单位编码 asm 字符串的任何东西吗?
- 如何以字节为单位计算mpz_class的长度?
- 获取C++模板参数包的总大小(以字节为单位)
- C++/C:Char[]的前缀长度(以字节为单位)(二进制/十六进制)
- visual 在指向缓冲区(字符串 " ")的空指针上使用 sizeof() C++ 以获得以字节为单位的大小?
- 如何获得以字节为单位的UTF-16LE字符串的大小
- 为什么 C/C++ "Hello World" 以千字节为单位?
- C++字符串长度(以字节为单位)
- 解码像 FAST 这样的数据协议的快速方法是什么,其中数据以字节为单位编码,并将位作为存在标志
- 解压缩加密文件(以字节为单位)
- 在 boost::multi_array 中以字节为单位表示步幅
- 省略号函数参数的大小(以字节为单位)
- C++获取EOL的大小(以字节为单位)
- 在openMPI中向进程发送数据(以字节为单位)的最佳方式
- 获取矢量的大小(以字节为单位)
- 如何将数组限制在特定的大小(以千字节为单位)