1. 程式人生 > 其它 >printf是如何實現可變引數的?自定義函式能否實現引數可變?【C語言】

printf是如何實現可變引數的?自定義函式能否實現引數可變?【C語言】

技術標籤:實戰經驗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_end:關閉引數列表
其中 “va”是variable-argument,即可變引數

② 函式的引數列表格式為(int n, …)
第一個引數必須有(但不一定為int),後面的…表示引數長度可變
[ 注:這裡把第一個引數設定為引數的個數,是最簡單的判斷引數個數的方法,不這樣做也沒問題的。如printf函式第一個引數為字串,引數的長度由字串內容決定,也可以通過將最後一個引數設定成特定的值如NULL來表示結束,方法不唯一]

③ 在初始化列表時,需要將定義的引數列表和函式的第一個引數傳入,即va_start(val, n);

④ 然後逐次呼叫va_arg(val, int)獲取引數的值(可以想象成連結串列),第二個引數是要獲取形參的資料型別

⑤ 最後在用完記得使用va_end(val)表示結束了

這麼一來,引數可變的自定義函式就已經實現啦!!
從這裡可以產生很多不同的變式,可以好好玩一陣子了2333

# printf函式的實現方法

有了前面的基礎,printf函式的實現也就不難了
先理一下思路:第一個引數傳入字串,裡面寫了各種格式字元,後邊跟著的是各個格式對應的資料。
那麼要知道資料的總量,就必須從字串中提取出來,我們可以寫一個函式,統計各個格式字元出現的先後順序以及對應的型別,順帶得出引數的個數,這樣,在每一次呼叫時輸出相應資料就可以了。

思路就是這樣子,程式碼就不上了,相信各位的能力哦ahhh


第四篇完成!打卡打卡~
本人也是初學了這個東西,有錯誤請各位大神指教> o <
堅持下去!(寒冰小澈)