模擬實現printf 函式

2021-08-17 05:18:06 字數 2204 閱讀 9509

在構建printf()函式之前,需要簡單分析printf(),在幫助文件中可以看到,printf()的格式為printf (char * format,...)

也就是說printf()是乙個可變引數的函式

此外,還需要了解這些引數是如何在記憶體中儲存的。從這個棧楨結構圖中可以看到print()函式的引數的存放方式,print()中的引數在形成臨時變數時是從右往左的,這也就可以解釋為什麼只傳入 char * format 就可以定位後面的不可變引數部分,char* format 作為左後乙個傳入的引數,可以方便的取出它的位址,那麼下乙個型別的位址就是第二個引數的位址

那麼現在就可以開始寫這個print()

#pragma warning(disable:4996)

# include

# include

//模擬實現printf函式,可完成下面的功能

//print("s ccc d\n", "hello", 'j', 'a', 'n', 100);

//print("你好 jan\n");//對引號內容的直接輸出

//能完成下面函式的呼叫。

//函式原型:

//print(char *format, ...)

//int print(char *s,...)

}else

if (*ch == 'c')//列印單個字元

else

if (*ch == 'd')//列印整數

;//定義乙個陣列存放整數的每一位

int cou = 0;

int tmp = a;

while (a > 9)//取每一位

arr[cou] = a;//補上最後一次迴圈的內容

while (cou)//迴圈列印每一位

putchar(arr[cou] + 48);//補上左後一次迴圈的列印結果

}else

//無特殊條件直接輸出

更新

看了幾遍第一次寫的printf,越看越覺得不舒服,所以重新寫了一遍

* 優化列印格式,對齊庫函式printf格式,使用』%』列印;

* 優化多個if()判斷為switch();

* 優化數字列印,使用遞迴列印

* 優化**,修改幾處不規範的用法

* 優化注釋,簡潔

* 優化**風格,整齊劃一

* 發現自己遞迴的一處用法錯誤

* …

#pragma warning(disable:4996)

# include

# include

# include

void print_num(int x)//遞迴列印%d的數字列印函式

putchar(x % 10 + '0');*/

if (x > 9)

putchar(x % 10 + '0');

}int nprint(const

char * format, ...)

}break;

case

'c':

break;

case

'd':

break;

default:

break;}}

break;

default://第乙個不是'%'的,直接輸出

模擬實現printf函式

如果要想解決這個問題 就要 知道乙個知識點 可變引數列表 可變引數列表是通過巨集來實現的,這些巨集定義於stdarg.h標頭檔案中,它是標準庫的一部分。這個標頭檔案宣告 個型別va list 和三個巨集va start va arg和va end。轉到定義處 檢視一下這幾個巨集和型別 typedef...

模擬實現 」printf「 函式

在c語言學習中,通過將函式實現為可變引數 形式,使得函式可以接受任意多個引數。當了解可變引數之後很容易實現printf函式。能完成下面函式的呼叫。print s ccc d.n hello b i t 100 函式原型 print char format,include include 使用可變引數...

模擬實現printf函式

printf函式我們平時用的最多,當然用的時候並沒有想太多庫裡面是如何實現這個函式的,下面我們來看看 首先我們來分析一下,printf需要具備的功能 1,輸出字串 2,輸出字元 3,輸出整型 4 當然還有其他的型別,這裡主要實現前三種 下面我們先寫出主函式 主函式如下 由於printf函式輸出的型別...