可變引數列表(模擬實現printf)
阿新 • • 發佈:2019-02-09
1.什麼是可變引數列表?
通過將函式實現為可變引數的形式,可以使得函式可以接受1個以上的任意多個引數。
我們先看一個例子:
int average(int n,...) { va_list arg; //相當於宣告一個指標,名字為arg int i = 0; int sum = 0; va_start(arg,n); for(i=0; i<n; i++) { sum += va_arg(arg,int); //用一次後,va_arg指向下一個引數 } return sum/n; va_end(arg); } int main() { int avg1=average(3,1,2,0); printf("%d",avg1); //平均值,就可以求出來了,也可求最大值 return 0; }
1.宣告一個va_list 型別的變數arg ,它用於訪問可變引數列表的未確定部分
2.va_start 用來初始化的,把arg變數設定為指向可變引數部分的第一個引數
3.va_arg 這個巨集接受兩個引數, va_list變數和引數列表中下一個引數的型別,並使他va_arg指向下一個可變引數。
4va_end ,使 arg指向空,畢竟arg為一個指標
5.printf就是通過可變引數列表寫的
下面是我自己模擬實現printf:
#include<stdio.h> #include<stdarg.h> void my_print(int n) { if(n>9) { my_print(n/10); } putchar(n%10+'\0'); } void print(char *format,...) { va_list arg; va_start(arg,format); while(*format) { switch(*format) { case 's': { char * ret = va_arg(arg,char*); while(*ret) { putchar(*ret); ret++; } } break; case 'c': { char ch =va_arg(arg,int); putchar(ch); } break; case 'd': { int cur = va_arg(arg,int); my_print(cur); } break; default: putchar(*format); break; } format++; } } int main() { print("s ccc d.\n","hello",'b','i','t',100); return 0; }