Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用可变函数C++;_C++_Variadic Functions - Fatal编程技术网

C++ 使用可变函数C++;

C++ 使用可变函数C++;,c++,variadic-functions,C++,Variadic Functions,我正在我的一个程序中使用可变函数。以下是它的定义: std::string GetMessage(const char *format,...) 现在,我想给用户提供一个额外的可行性,以提供他想要的纯字符串。 比如-GetMessage(“这是我的消息”) 我在处理这些输入时遇到麻烦,带有变量的输入工作正常 我试过了 val_list vl; va_start(vl,format); if(strlen(vl) > 1) // TO check if va list has any a

我正在我的一个程序中使用可变函数。以下是它的定义:

std::string GetMessage(const char *format,...)
现在,我想给用户提供一个额外的可行性,以提供他想要的纯字符串。 比如-
GetMessage(“这是我的消息”)

我在处理这些输入时遇到麻烦,带有变量的输入工作正常

我试过了

val_list vl;
va_start(vl,format);

if(strlen(vl) > 1) // TO check if va list has any arguments.
但它的行为非常一致


那么,有人能给我建议一种更好的方法来知道变量函数是否有参数吗?

调用者必须主动传递一些值,让被调用的var/stdarg函数知道参数的结束位置。常用技术包括:

  • 传递sentinel值,例如尾部NULL
  • 通过计数
  • 传递一个格式字符串,其中嵌入的内容(例如
    %
    -用于
    printf()
    等的前缀格式)表示所需的参数数量

有时,您可以通过插入sentinel的宏来调用变量函数,从而促进变量函数的可靠使用,一些编译器允许您借助它们的
printf()
样式参数检查(例如GCC)。

发布
GetMessage
的实现。“我面临麻烦”是不够的。std::string GetMessage(const char*format,…){va_list vl;int I=0;std::stringstream ss;va_start(vl,format);switch(format[I]){//Type to expect。case'c':{char c=va_arg(vl,char);ss@user987316您不需要使用
return const_cast(ss.str().c_str());
-只需
return ss.str()
。关键的是,您需要一个
for(int i=0;;+i)
va_start
之后循环,并围绕
开关进行循环,这样您就可以处理多个参数。
str
作为
const char*
更好,但这并不重要。有没有办法知道用户是否提供了任何变量参数?我想在GetMessage(“%s%d”,variable1,variable2)之间进行区分和GetMessage(“函数运行已完成”)。我知道在后面的部分我可以像GetMessage(“函数运行已完成”)那样编写但我认为这是不必要的,不是一个很好的代码实践。你在这方面有什么用处?“USER 98316:当然有一种方法…搜索一个<代码> '%'/COD>是格式字符串。另一个因素是你是否相信字符串……考虑一下代码> GetMessage(“%s”,用户名)< /C> >如果一些不爱的用户输入他们的用户名为“坏%s %s弗雷迪”。,而
GetMessage(username)
将尝试获取另外两个不存在的指针-从堆栈读取垃圾值-更糟糕的是,它将跟随这些垃圾指针,并尝试在它们包含的地址使用假定的ASCIIZ文本:它可能会使你的应用程序崩溃,但可以小心地用来接管你的帐户。