printf是如何實現可變引數的?自定義函式能否實現引數可變?【C語言】
序
在我們使用C語言的printf和scanf函式時,是否有好奇過它到底是怎麼實現引數任意多的呢?
(開始以為是系統自帶的,有無小夥伴一起的2333)
好奇心驅使下,終於瞭解到具體的實現方法
接下來就一起一步一步揭祕吧 ohhh!!
# 首先進行比較簡單的可變引數自定義函式
程式碼先掛上:
#include <stdio.h>
#include <stdarg.h>
void myPrintf(int n, ...)
{
int i;
va_list val;
va_start(val, n);
for (i = 0; i < n; i++)
{
printf(" %d\n", va_arg(val, int));
}
va_end(val);
}
int main()
{
myPrintf(3, 2, 4, 7);
return 0;
}
執行結果:
再改呼叫語句為myPrintf(4, 2, 4, 7, 11);
顯然我們需要的可變引數功能已經實現了!!
下面對程式碼進行解釋:
① 首先需要準備標頭檔案include <stdarg.h>
需要用到:
va_list:定義引數列表
va_start:初始化引數列表
va_arg:獲取每一個引數的值(需要迴圈呼叫)
其中 “va”是variable-argument,即可變引數
② 函式的引數列表格式為(int n, …)
第一個引數必須有(但不一定為int),後面的…表示引數長度可變
[ 注:這裡把第一個引數設定為引數的個數,是最簡單的判斷引數個數的方法,不這樣做也沒問題的。如printf函式第一個引數為字串,引數的長度由字串內容決定,也可以通過將最後一個引數設定成特定的值如NULL來表示結束,方法不唯一]
③ 在初始化列表時,需要將定義的引數列表和函式的第一個引數傳入,即va_start(val, n);
④ 然後逐次呼叫va_arg(val, int)
獲取引數的值(可以想象成連結串列),第二個引數是要獲取形參的資料型別
⑤ 最後在用完記得使用va_end(val)
表示結束了
這麼一來,引數可變的自定義函式就已經實現啦!!
從這裡可以產生很多不同的變式,可以好好玩一陣子了2333
# printf函式的實現方法
有了前面的基礎,printf函式的實現也就不難了
先理一下思路:第一個引數傳入字串,裡面寫了各種格式字元,後邊跟著的是各個格式對應的資料。
那麼要知道資料的總量,就必須從字串中提取出來,我們可以寫一個函式,統計各個格式字元出現的先後順序以及對應的型別,順帶得出引數的個數,這樣,在每一次呼叫時輸出相應資料就可以了。
思路就是這樣子,程式碼就不上了,相信各位的能力哦ahhh
第四篇完成!打卡打卡~
本人也是初學了這個東西,有錯誤請各位大神指教> o <
堅持下去!(寒冰小澈)