在構建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函式輸出的型別...