我有一个函数应该根据格式字符串获取可变数量的参数(使用varargs):
void va(const char* name, const char* argformat, ...) {
int numOfArgs = strlen(argformat);
std::string buf = "asdf";
va_list listPointer;
va_start(listPointer, numOfArgs);
char* blah;
for(int i = 0; i < numOfArgs; i++) {
switch (argformat[i]) {
case 's':
cout << va_arg(listPointer, char*) << endl;
break;
case 'i':
cout << va_arg(listPointer, int) << endl;
break;
case 'f':
cout << va_arg(listPointer, float) << endl;
break;
case 'b':
cout << va_arg(listPointer, bool) << endl;
break;
default:
break;
}
}
va_end(listPointer);
return;
}
int main() {
va("fe", "sb", "asdf", true);
return 0;
}
它崩溃了。
如果我改变了
cout&lt;&lt; va_arg(listPointer,char *)&lt;&lt; ENDL;
到
cout&lt;&lt; va_arg(listPointer,char)&lt;&lt;结束;
打印“a”。
我做错了什么?
答案 0 :(得分:6)
应该是va_start(listPointer, argformat)
。 va_start
将最后一个命名参数作为其第二个参数。 (从技术上讲,这意味着您根本不需要预先计算参数字符串的长度 - 只需迭代字符(随着时间的推移迭代varargs),直到到达字符串的末尾。)