stdarg.h实现可变参数
stdarg.h实现可变参数
- 本篇谈论用标准库stdarg.h实现不定参数的方方面面(11/24/2019 11:48:35 PM )
- 小技巧:实现格式输入、输出(见更新)
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); // 释放不定参数表