C/C++ 头文件<stdarg.h>


我们用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
}


Author: Tsum
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Tsum !
  TOC