我正在尝试编写printf的变体,其中正在打印的项和正在打印的格式是调用中的相邻参数,如。。。

print(2, "%s", "hello", "%.5u", 25);

我研究过var args,并想出了。。。。
void print(int count, ...)
{
    va_list varg;
    va_start(varg, count);

    while(count-- > 0)
    {
      char* format = va_arg(varg, char*);
      vprintf(format, varg);
    }

    va_end(varg);
}

vprintf似乎没有使用它从堆栈中使用的项。我的输出是
赫洛赫洛
我相信这也在扩大
printf("%s", "hello);
printf("hello");

那么,vprintf没有使用arg列表中的“hello”,我做错了什么?
更新:根据下面的评论
void print(int count, ...)
{
    va_list varg;
    va_start(varg, count);

    while(count-- > 0)
    {
      char* format = va_arg(varg, char*);
      void* arg    = va_arg(varg, void*);
      printf(format, arg);
    }

    va_end(varg);
}

这似乎完成了任务。

最佳答案

vau列表只是一个地址(在典型的实现中)。它是按值传递给函数的,因此调用函数中的原始值是未修改的。

10-07 13:07