stdarg.h实现可变参数

stdarg.h实现可变参数

  1. 本篇谈论用标准库stdarg.h实现不定参数的方方面面(11/24/2019 11:48:35 PM )
  2. 小技巧:实现格式输入、输出(见更新)

stdarg.h的介绍

stdarg.h是C语言中C标准函数库的头文件,stdarg是由standard(标准) arguments(参数)简化而来。

我们常常看到一些函数形如:printf(const char *fomat,…);
这类型的函数就可以用该标准头文件实现。

包含成员

va_list:

用来保存va_start()va_arg()va_end() 这三个宏存储信息的类型。

va_start:

 void va_start(va_list list, arg)

将va_list指向初始参数

  • arg为函数的最后一个非不定参数,如:上面的printf函数,该参数就要填fomat。

va_arg:

type va_arg(va_list list, type)

从list中取出参数并指定为type类型返回,同时移动指针指向下一个参数

  • 注意:一定要确保函数的type类型和返回值相同

va_end:

void va_end(va_list list)

释放list,将其置NULL。

具体用法

char **CreateStrings(int nNum, const char *nName,...);
//生成一个字符串数组

//代码如下:
va_list ParamList;
va_start(ParamList, nName); // 最后一个非可变参数

char **sRet = (char **)malloc(sizeof(char *)*(nNum+1));                 // 创建二级指针
if(sRet!=NULL)
{
    // 此处不用纠结,只是填入nName参数到返回的字符串数组中
    char *sMenber = NULL;
    char *sTmp = NULL;
    sMenber = (char *)malloc(sizeof(char)*strlen(nName));           
    if(strcpy(sMenber, nName)!=NULL)                                // copy string to sMenber
        *sRet = sMenber;                                            // add sMenber to sRet
    else
        return NULL;                                                // test copy
    // 此处不用纠结

    // 正戏开始
    for(i=1; i<=nNum-1; i++)
    {
        sTmp = va_arg(ParamList,char *);                            // 多次从不定参数表取出参数,转为char *类型
        if(sTmp==NULL)
            return NULL;
        sMenber = (char *)malloc(sizeof(char)*strlen(sTmp));
        strcpy(sMenber, sTmp);
        *(sRet+i) = sMenber;                                   
    }
    *(sRet+nNum) = NULL;
}
va_end(ParamList);                                                    // 释放不定参数表