在 C 中,如何在调用 vsnprintf() 之前将可变数量的参数(例如 50+)传递给 va_start() 理解的函数?

ven*_*ngy 1 c linux

问题

有没有办法使用某种数组将许多参数传递给下面的 MyPrint() ,该数组包含指向 va_start() 在调用vsnprintf()之前理解的字符串的指针列表?

格式字符串说明符的示例。最好创建一个相应值的数组并将其传递给 MyPrint(),而不是单独传递每个参数。我不知道va_start()是否可以理解它。:(

"[0x%llX][%u] %s --- A=%llu (0x%llX)  B=%llu (0x%llX)  C=%llu (0x%llX)  X=%llu (0x%llX)  Y=%llu (0x%llX)  Z=%llu (0x%llX)"
Run Code Online (Sandbox Code Playgroud)

细节

MyPrint() 调用vsnprintf(),后者将格式化的参数列表打印到字符数组。vsnprintf() 的声明如下所示:

int vsnprintf(char *arr, size_t len, const wchar_t *format, va_list args);
Run Code Online (Sandbox Code Playgroud)

参数

  • arr:指向要打印输出的字符数组的指针
  • len:可以写入数组的最大字符数
  • format:打印输出的格式
  • args:指向要打印的参数列表的指针

演示

#include <stdio.h>
#include <stdarg.h>

int MyPrint(char* buffer, int bufferSize, const char *format, ...)
{
    int len = 0;
    va_list arguments;
    va_start(arguments, format);
    len = vsnprintf(buffer, bufferSize, format, arguments);
    va_end(arguments);
    return len;
}

int main()
{
    char buffer[256];
    MyPrint(buffer, 256, "%s %s","Hello","World");
    printf("%s",buffer);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ger 5

有没有办法使用某种包含 va_start() 在调用之前理解的字符串的指针列表的数组将许多参数传递给下面的 MyPrint() vsnprintf()

初始化 a 的唯一定义方法va_list(例如vsnprintf()作为参数的 require )是

  • 通过va_start()宏,在可变参数函数的上下文中进行操作,以va_list从函数的可变参数形成 a ,以及

  • 通过va_copy()宏,复制另一个va_list.

标准 C 中没有任何机制可以va_list从数组的元素形成 a ,除非将它们全部单独传递给可变参数函数。

可变参数函数是关于编码灵活性,而不是数据灵活性。如果您想要一个处理数据数组的函数,请编写一个(非可变参数)函数来处理数据数组。

每当您考虑编写自己的可变参数函数时,请敲一下自己的头并重复这句咒语:“可变参数不是答案”。仅当经过几次迭代后您的头脑中仍然有可变参数时,您才应该考虑实际研究该选项。