一個函數在不同的時候接受不同數目的參數。
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; }