我們來假設一種情景:有一個點餐的函數,它接收菜品名作為參數,當客人點一個菜時就傳遞一個參數,但是客人點的數量都不一樣,有的多有的少,顯然固定的參數個數是無法适應這種變化的。那該怎麼辦呢?
如果大家對printf()函數還有印象的話,那麼就知道它接收參數的數量是可變的。它是如何做到的呢?其實它要用到可變數量參數。參數數量可變的函數,我們稱其為可變參數函數。C标準庫中有一組宏可以幫助我們建立可變參數函數,是以要加入處理可變參數函數的代碼的頭檔案stdarg.h。事不宜遲,我們先來定義一個可變參數函數:
#include <stdarg.h>
void print_ingredient(int args,...){
va_list ap;
va_start(ap,args);
int i;
for(i = 0; i < args ; i++){
printf("Ingredient:%s\n",va_arg(ap,char*));
}
va_end(ap);
}
說明一下上面各部分的含義:
- 首先要加入頭檔案stdarg.h,這樣才可以處理可變參數函數。
- 形參的第一個參數args,是要告訴函數後面跟的可變參數的個數,函數參數後面的省略号“…”表示還有更多參數。
- va_list用來儲存傳給函數除了args之外的其他參數。
- va_start(ap,args),中的agrs是告訴函數va_start()從哪個偏移位置開始讀取可變參數,然後存入ap。
- va_arg(ap,int),va_arg()接收兩個值:一個是va_list另一個是要讀取參數的類型。
- va_end(ap);當va_arg()讀完了所有參數,要用va_end()宏告訴C你完成了。
#include <stdio.h>
#include <stdarg.h>
void print_ingredient(int args,...);
int main(){
print_ingredient(3,"cabbage","potato","tomato");
return 0;
}
void print_ingredient(int args,...){
va_list ap;
va_start(ap,args);
int i;
for(i = 0; i < args ; i++){
printf("Ingredient:%s\n",va_arg(ap,char*));
}
va_end(ap);
}
~/Desktop/Mc$ gcc test1.c -o test1
~/Desktop/Mc$ ./test1
Ingredient:cabbage
Ingredient:potato
Ingredient:tomato