模擬實現printf函式

2021-08-07 04:21:58 字數 1569 閱讀 1806

如果要想解決這個問題 ,就要 知道乙個知識點 ,可變引數列表  ,

可變引數列表是通過巨集來實現的,這些巨集定義於stdarg.h標頭檔案中,它是標準庫的一部分。這個標頭檔案宣告

個型別va_list 和三個巨集va_start、va_arg和va_end。

轉到定義處 檢視一下這幾個巨集和型別 

typedef char *  va_list;

#define _intsizeof(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

#define _crt_va_start(ap,v) ( ap = (va_list)_addressof(v) + _intsizeof(v) )

#define _crt_va_arg(ap,t) ( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) )

#define _crt_va_end(ap) ( ap = (va_list)0 )

從上 面可以看出  va_list 表示的是 乙個 char*的指標 

#define _intsizeof(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
_insizeof( n) 表示 的 是將 乙個型別 如果該型別的空間位元組數為"1 2 3 4"  都將它進製 為4位元組 

如果該型別的空間位元組數為"5 6 7 8 " 都將它進製 為8位元組 

#define _crt_va_start(ap,v)  ( ap = (va_list)_addressof(v) + _intsizeof(v) )
表示的是 將 ap跳過第乙個引數 v ,指向下乙個 

#define _crt_va_arg(ap,t)    ( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) )

表示的是 要計算的引數,但是此時的 ap指向的是下乙個引數,這樣就可以為下乙個引數的使用做好基礎

#define _crt_va_end(ap)      ( ap = (va_list)0 )
結束 後 將 ap  賦值為 \0;

下面是我寫的乙個簡單 的printf()函式 

**實現

#define  _crt_secure_no_warenings 1

#include#include#includevoid puts(const char *src)//我自己定義的puts 函式 輸出時不會輸出『\n』

}void my_printf(const char *src,...)

else if(*src == 'c')

else //如果不是型別名 就 原型輸出

putchar(*src);

src++;

} va_end(arg);

}int main()

模擬實現printf 函式

在構建printf 函式之前,需要簡單分析printf 在幫助文件中可以看到,printf 的格式為printf char format,也就是說printf 是乙個可變引數的函式 此外,還需要了解這些引數是如何在記憶體中儲存的。從這個棧楨結構圖中可以看到print 函式的引數的存放方式,print...

模擬實現 」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函式輸出的型別...