首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将可变数量的参数传递给printf/sprintf

如何将可变数量的参数传递给printf/sprintf
EN

Stack Overflow用户
提问于 2009-06-29 03:11:11
回答 7查看 129.5K关注 0票数 88

我有一个类,它包含一个"error“函数,它将格式化一些文本。我希望接受数量可变的参数,然后使用printf对它们进行格式化。

示例:

代码语言:javascript
复制
class MyClass
{
public:
    void Error(const char* format, ...);
};

Error方法应该接受参数,调用printf/sprintf对其进行格式化,然后对其执行某些操作。我不想自己编写所有的格式,所以尝试并弄清楚如何使用现有的格式是有意义的。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-06-29 03:22:21

代码语言:javascript
复制
void Error(const char* format, ...)
{
    va_list argptr;
    va_start(argptr, format);
    vfprintf(stderr, format, argptr);
    va_end(argptr);
}

如果您希望在显示字符串之前对其进行操作,并且确实需要首先将其存储在缓冲区中,请使用vsnprintf而不是vsprintfvsnprintf将防止意外的缓冲区溢出错误。

票数 166
EN

Stack Overflow用户

发布于 2009-06-29 03:15:47

看一看vsnprintf,因为它将执行您想要的http://www.cplusplus.com/reference/clibrary/cstdio/vsprintf/

您必须先初始化va_list arg数组,然后再调用它。

来自该链接的示例: /* vsprintf示例*/

代码语言:javascript
复制
#include <stdio.h>
#include <stdarg.h>

void Error (char * format, ...)
{
  char buffer[256];
  va_list args;
  va_start (args, format);
  vsnprintf (buffer, 255, format, args);


  //do something with the error

  va_end (args);
}
票数 42
EN

Stack Overflow用户

发布于 2009-06-29 03:15:52

我应该在堆栈溢出中阅读更多关于现有问题的内容。

C++ Passing Variable Number of Arguments也是一个类似的问题。Mike F有以下解释:

在不知道传递了多少参数的情况下无法调用(例如) printf,除非你想玩一些顽皮的、不可移植的把戏。

通常使用的解决方案是总是提供另一种形式的vararg函数,因此printf有vprintf,它用va_list代替...那个..。版本只是va_list版本的包装器。

这正是我要找的。我执行了一个测试实现,如下所示:

代码语言:javascript
复制
void Error(const char* format, ...)
{
    char dest[1024 * 16];
    va_list argptr;
    va_start(argptr, format);
    vsprintf(dest, format, argptr);
    va_end(argptr);
    printf(dest);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1056411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档