sprintf/格式化字符串能否直接传递给函数? C++中允许这样的事情吗?如果是,我该怎么做 myFunction("User input: %s", a);

sprintf/格式化字符串能否直接传递给函数? C++中允许这样的事情吗?如果是,我该怎么做 myFunction("User input: %s", a);,c++,printf,C++,Printf,还是先格式化然后再传递的唯一方法?您可以合法地进行操作,但以下情况除外: sprintf的行为是将格式应用于字符串。在该函数之外(以及通常的printf系列),此处的参数实际上没有“意义”,因为函数签名可能如下所示: void myFunction(const char* str1, const char* str2); 但它的作用取决于你 如果要在将字符串传递到某个函数之前对其进行修改,则必须在myFunction外部(通过sprintf或其他方式)对其进行修改,或者将所有参数传入函数并在函

还是先格式化然后再传递的唯一方法?

您可以合法地进行操作,但以下情况除外:

sprintf
的行为是将格式应用于字符串。在该函数之外(以及通常的
printf
系列),此处的参数实际上没有“意义”,因为函数签名可能如下所示:

void myFunction(const char* str1, const char* str2);
但它的作用取决于你


如果要在将字符串传递到某个函数之前对其进行修改,则必须在
myFunction
外部(通过
sprintf
或其他方式)对其进行修改,或者将所有参数传入函数并在函数内部调用
sprintf

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

如果您想编写一个采用可变参数的函数,答案是肯定的,下面是如何声明这样一个函数:

void myFunction(const char*, ...);
注意结尾的省略号

但是现在你知道怎么做了,我会把事情复杂化。您不应该这样做。上面声明的<代码> MyMyFror()/<代码>类型不安全,完全回避C++中的每一种方法来保护您不犯错误。 还有其他方法可以实现类似的功能(
vector
),但我发现,如果您需要一个具有可变参数的函数,那么代码的气味首先表明您的设计有问题。仔细看看你为什么需要这个

编辑: 如果您试图做的不是传递变量参数本身,而是传递格式化字符串(如OP所说),那么您需要在函数中自己进行字符串格式化。根据您的平台,有多种方法可以做到这一点。在Windows中,您可能会使用或类似的工具

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

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


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

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

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

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

是的--听起来像是extract method object:PHm的例子,我想如果格式化是在发送字符串的部分完成的,那么函数会将其作为单个参数接收。。或者声明函数以接收sprintf类型。看来我会先格式化它,然后再传递出去。@thorvald:I;我不知道你所说的“格式化是在发送字符串的部分完成的”是什么意思。你能解释一下吗?另外,
sprintf
不是一种类型,而是一种函数。另请参见