可變引數列表 簡單printf函式的實現

2021-05-24 14:12:49 字數 1074 閱讀 7984

有時候形式引數不確定,ansi c採用可變引數列表的形式來實現這種函式,在stdarg.h中包括三個巨集:va_list   va_start (va_list,pre_arg) 

va_arg(va_list,type)  va_end(va_list),作用分別是:建立乙個指標指向函式的最後乙個引數;取出type型別的下乙個引數,並將va_list型別的變數指向下乙個變數,va_end結束可變函式.

以簡單的printf函式為例:

void printf(char *fmt)

int d;

char buf[10];

char ch;

va_list ap;//建立指標ap

va_start(ap,fmt)//將ap指向fmt的下乙個引數,fmt即輸出的格式字串

while(*fmt)//如果格式字串沒有到達『/0』

if(*fmt!='%')//如果是%格式串之前的字串常量,則輸出

putchar(*fmt++);

continue;//結束這次if

switch(*fmt)//如果到達%格式輸出,如%d等,這裡做了簡化,沒有考慮在%和d之間的- + 等輸出限定字元

case 'd'://如果是輸出整數

d = va_arg(ap,int);//利用va_arg巨集取出現在的ap指向的引數的值,並指向int型別後的下乙個引數

itoa(d,buf,10);//將整數轉換為字串,一般這個函式在stdlib.h裡,gcc好像只有atoi,自己寫了

puts(buf);//輸出整數

break;

case 'c'://輸出字元

ch = va_arg(ap,int)//注意int,因為可變引數預設使用型別提公升,所以char要寫成int型別

putchar(ch);

break;

case 's'://輸出字串

s = va_arg(ap,char *);

puts(s);

break;

default:

break;

fmt++;//指向格式串的下乙個字元

va_end(cp);

可變引數列表

模擬實現printf函式 va list是在c語言中解決變參問題的一組巨集,所在標頭檔案 include 用於獲取不確定個數的引數 va start,函式名稱,讀取可變引數的過程其實就是在堆疊中,使用指標,遍歷堆疊段中的引數列表,從低位址到高位址乙個乙個地把引數內容讀出來的過程 va arg,這個巨...

可變引數列表

小二,上 class a public class varargs two param static void twostringparam string a,string b three param 參照上兩種寫法,一直往後面加。是不是感覺很憂傷 幸好這不是真的。string.a static v...

可變引數列表

測試環境 vs2008 1 可變引數列表 為什麼需要可變引數呢?在函式原型中,列出了函式期望接受的引數,原型只能顯示固定數目的引數,如果函式原型列出的引數與可呼叫引數不匹配或數目不一樣,程式將無法執行。例如,我們想要求一系列值的平均值,這裡的一系列的數目是不確定的,如果這些值儲存於陣列中,這個任務就...