void fun(int a,...) { va_list parameter; va_start(parameter, a); va_arg(parameter, int ); }
舉個例子,如果要實現求多個數的平均值,因為C中不允許默認參數,所以只能用上述方法進行求平均數,代碼如下
int average(int val, ...) { va_list arg; int sum = 0; int i = 0; va_start(arg, val); //va_arg(); for (i = 0; i < val; i++) { sum += va_arg(arg, int);//每調用一次向下取一個 } va_end(arg); return sum / val; }
如果要求多個數的最大值可以寫為
int average(int val, ...) { va_list arg; int max; int sum = 0; int i = 0; va_start(arg, val); for (i = 0; i < val; i++) { sum = va_arg(arg, int); if (sum>max) max = sum; } va_end(arg); return max; }
由此我們還可以用stdarg這個宏來模擬printf函數的實現,這裡我只是做了模擬了字符串輸出,整形與字符型輸出代碼如下:
#include<stdio.h> #include<stdarg.h> void printd(int n)//把整形按字符型輸出 { if (n < 0) { putchar('-'); } if (n) { printd(n /10); putchar(n % 10 + '0'); } } void my_printf(char* val,...) { int ch; va_list arg; va_start(arg, val); while (*val != '\0') { switch (*val) { case '%': //遇到%執行switch case語句 { if (*(val + 1) == 'c')//輸出字符 { ch = va_arg(arg, char); putchar(ch); val++; //指針變量向下偏移一個單位 } else if (*(val + 1) == 'd') { ch = va_arg(arg, char);//輸出整形 printd(ch); val++; } else if (*(val + 1) == 's')//輸出字符串 { char*p = va_arg(arg, char*); while (*p != '\0') { putchar(*p); p++; } val++; //指向頭一變量的下一個字符 } else putchar('%'); break; } default: { putchar(*val); break; } } val++; } va_end(arg); } int main() //程序調試 { int c =100 ; char*p = "laomasb"; char a = 'c'; my_printf("%s\n%d\n%c\n", p, c,a); system("pause"); return 0; }
這裡寫得還差很多,比如說%後面加數字的話是沒辦法識別並且寇沖輸出空間的,而且這代碼自己看著就比較low。希望大神給出些建議。