【问题标题】:Using printf in C when I don't know how many arguments until runtime当我直到运行时才知道有多少参数时在 C 中使用 printf
【发布时间】:2012-11-15 19:10:50
【问题描述】:

我有一种情况,我试图打印出用户在 Lua 中格式化并通过注册函数发送给我的信息。我从客户那里得到的是一个格式字符串、参数的数量以及每个参数作为一个数字。在调用此函数之前,我不知道用户将拥有多少个参数。我通过查询lua系统得到它们。

如何在运行时使用格式字符串和数字列表调用 printf?我可以在运行时为数字的值分配一个数组,但 printf 期望一个 va_list 而不是参数的数字数组。

根据参数的数量,我可以有大量的“if”语句,但我正在寻找一种更巧妙的方法。

有什么想法吗?

【问题讨论】:

  • 循环遍历你的函数中的列表并附加到前一个 printf?.
  • 试试 vprintf。 IIRC 它适用于数组

标签: c variables runtime arguments printf


【解决方案1】:

如果您只需要打印出值,您可以使用 for 循环遍历所有值并单独打印它们,只需没有换行符。

【讨论】:

  • 由于 printf 缓冲,您不会遭受任何性能不足的困扰。
  • 这通常可以工作,但在这种情况下,用户会希望以不同的方式格式化每个数字(第一个数字为 6 个小数位,下一个数字没有小数位,等等)
  • 如果您事先知道,为什么会有问题...?
【解决方案2】:

我认为您可以只使用一个打印 %s 的 printf,并将返回 char* 的函数作为参数传递。该函数将接受参数数组作为参数。在函数内部,您可以使用 sprintf 将所有参数格式化为“字符串”,最后返回创建的“字符串”。

【讨论】:

    【解决方案3】:

    我认为在循环中重复调用 printf,显然会运行“参数数量”次。我的意思是:

    void YourFunction(char *format, int number_of_arguments, int *arguments)
    {
        for(int index = 0; index < number_of_arguments; index++)
        {
            printf(format, arguments[index]);
        }
    }
    

    现在您可以按照自己的方式对其进行格式化,例如添加换行符,

    strcat(format, "\n");
    

    如果我误解了你的问题,请纠正我。

    【讨论】:

      猜你喜欢
      • 2010-09-30
      • 2011-08-18
      • 1970-01-01
      • 2013-03-28
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      相关资源
      最近更新 更多