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文本:它可能会使你的应用程序崩溃,但可以小心地用来接管你的帐户。