一個函數在不同的時候接受不同數目的參數。
stdarg宏
可變參數列表是通過宏來實現的,這些宏定義于stdarg.h頭文件中。這個頭文件聲明了一個類型va_list和三個宏---va_start,va_arg,va_end。
va_list用于聲明變量的類型。
va_start準備訪問可變參數。
va_arg用于訪問參數列表的未確定部分。
va_end訪問完畢最后一個可變參數后使用。
可變參數的限制
(1)可變參數必須從頭至尾按順序逐個訪問。
(2)參數列表中的可變參數部分并沒有原型,所以,所有作為可變參數傳遞給函數的值都將執行缺省參數類型提升。
(3)可變參數列表至少接受一個參數。如果連一個命名參數都沒有,你就無法使用va_start。
(4)在va_arg中不許指定錯誤的類型,否則其結果是不可預測的。
可變參數的應用:
計算指定數量的值的平均值:
#include<stdio.h>
#include<stdarg.h>
int??average(int?count,...)
{int?i?=?0;int?sum?=?0;va_list?arg;va_start?(arg,count);for(i?=?0;i?<?count;?i++){sum?+=?va_arg(arg,int?);}va_end(arg);return?sum/count;
}
int?main()
{int?ret?=?average(4,1,2,3,6);printf("%d\n",ret);return?0;
}
2.計算三個數的最大值:
#include<stdio.h> #include<stdarg.h> int?max(int?count,...) {int?max?=?0;int?i?=?0;va_list?arg;va_start(arg,count);max?=?va_arg(arg,int);for(i=1;i<count;i++){int?tmp?=?va_arg(arg,int);if(tmp?>?max){max?=?tmp;} } va_end(arg);return?max; } int?main() {int?ret=max(3,1,2,3);printf("%d\n",ret);return?0; }
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdarg.h>
void?my_printf(const?char?*str,int?count,...)
{int?i?=?0;va_list?arg;va_start(arg,count);for(i?=?0;i?<?count;?i++,*str++){char?*a;char?b?=?0;int?c?=?0;switch(*str){case?'s':a?=?va_arg(arg,char?*);while(*a){putchar(*a);*a++;}break;case?'c':b?=?va_arg(arg,char);putchar(b);break;case?'d':c?=?va_arg(arg,int);c?=?c+'0';putchar(c);break;default:putchar(*str);break;}}va_end(arg);
}
int?main()
{char?*str?=?"d\nccc\ts";int?len?=?strlen(str);my_printf(str,len,1,'b','i','t',"welcome");return?0;
}