sprintf /格式化字符串可以直接传递给函数吗?

时间:2010-11-30 15:53:04

标签: c++ printf

C ++中是否允许这样的内容?如果是这样,我该怎么做?

myFunction("User input: %s", a);

或者是首先将其格式化然后通过它的唯一方法?

5 个答案:

答案 0 :(得分:3)

如果你想编写一个带变量参数的函数,答案是肯定的,这就是你如何声明这样一个函数:

void myFunction(const char*, ...);

注意最后的省略号。

但既然你知道怎么做,我会为你复杂化。你不应该这样做。上面声明的myFunction()类型不安全,完全避开C ++必须保护您免受错误的所有方法。

还有其他方法可以实现这样的事情(vector浮现在脑海中),但我发现如果你需要一个带有可变参数的函数,那就是代码气味,表明存在某些问题首先是你的设计错了。仔细看看为什么你需要这个。

编辑:

如果你要做的不是传递变量参数本身,而是传递格式化的字符串(就像你说的那样),那么你需要在你的函数中自己进行字符串格式化。根据您的平台,有很多方法可以做到这一点。在Windows中,您可能使用vsprintf()或类似的东西。

但是,如果你需要这样做,还有更好的方法。就个人而言,我喜欢使用Boost format

答案 1 :(得分:3)

我想你想要的是从myFunction调用类似vsprintf的函数 - 这样你就可以在函数内部进行格式化。例如:

void myFunction(const char *format, ...)
{
  char buf[1024];

  va_list arglist;
  va_start( arglist, format );
  vsprintf(buf,format,arglist);
  va_end( arglist );
}

答案 2 :(得分:1)

做你正在做的事情是合法的,除了:

sprintf的行为是将格式应用于字符串。在该函数之外(以及一般的printf族),这里的参数并不真正意味着什么,因为你的函数签名可能如下所示:

void myFunction(const char* str1, const char* str2);

但它做什么取决于你。

如果你想在将字符串传递给某个函数之前修改它,你必须在myFunction之外修改它(通过sprintf或其他)或者传递所有参数并调用{{1在函数内部。

答案 3 :(得分:0)

是的,这是允许的。不,它不是标准库的一部分,因此您必须自己实现它。

答案 4 :(得分:0)

可以使用C库中的vsprintf()函数,并将myFunction()写为变量参数。

然而,关于变量参数方法的通常免责声明适用:以这种方式引入缓冲区溢出或分段违规非常容易。有些编译器允许您将myFunction()声明为“类似printf”,这样您就可以对参数进行一定程度的编译时检查,但这不是可移植的。