我们用scanf函数可以读入任意多个数据
如果我们用过C++ 的输入、输出流(cin、cout)会发现它也能输入任意多个数字。
如何自己写一个函数,实现能够传递任意参数的功能呢?
stdarg.h
头文件提供了方法。
stdarg
提供了一个数据类型和四种函数。分别是:
va_list
: 数据类型,可以看做一个链表,用于存放传入函数的多个参数。va_start()
: 初始化一个 va_list 类型的链表。函数原型:
void va_start (va_list ap, paramN);
ap是自己定义的一个va_list
类型变量。paramN
是数据个数。
执行之后,ap就携带了传入数据的所有信息。
va_arg()
: 得到链表中下一个数据。函数原型:
type va_arg (va_list ap, type);
type 表示数据类型
此函数用来得到每一个传入函数的参数。
va_end()
将一个va_list
链表弃用。原型:
void va_end (va_list ap);
得到所有数据之后,将这个链表ap回收。
例:实现一个函数,可以输入任意多个链表
typedef struct Node *PtrToNode;
struct Node
{
int Data;
PtrToNode Next;
};
typedef PtrToNode List;
void ReadList(int num_args, ...)
{
va_list BufferList;
int val;
List L;
va_start(BufferList, num_args); //初始化BufferList
while (num_args--)
{
L = va_arg(BufferList, List); // 这里L是一个新的链表头。
scanf("%d", &val);
while (val != -1) // 输出 -1 表示链表结束
{
append(L, val); // 添加val,具体实现不表。
L = L->Next;
scanf("%d", &val);
}
}
va_end(BufferList); //销毁 BufferList
}