實現自己的變參函式printf

2021-06-18 17:17:36 字數 2032 閱讀 1085

在c/c++標準庫中,變參函式很特別。printf, fprintf, sprintf等都屬於變參函式。如果自己要寫類似的引數可變的函式,通常會用到下面三個函式:

#

include

void

va_start

(va_list ap, last)

;type va_arg

(va_list ap, type)

;void

va_end

(va_list ap)

;

一般的用法是這樣:

va_list args; //宣告變數

va_start(args, fmt); //開始解析。args指向fmt後面的引數

type var = va_arg(args, type); //取下乙個引數並返回。args指向下乙個引數

va_end(args); //結束解析

下面就給出具體的例子:

#

include

#include

/** conver int to string based on radix (usually 2, 8, 10, and 16)

*/char

*itoa(

int num,

char

*str,

int radix)

}j = ptr - str - 1;

for(i = 0; i <

(ptr - str)

/ 2; i++)

return str;}/*

* a ****** printf function. only support the following format:

* code format

* %c character

* %d signed integers

* %i signed integers

* %s a string of characters

* %o octal

* %x unsigned hexadecimal

*/int my_printf(

const

char

* format,..

.)elseif(

*(format+1)==

'd'||*

(format+1)==

'i')

elseif(

*(format+1)==

'o')

elseif(

*(format+1)==

'x')

elseif(

*(format+1)==

's')

// skip this two characters.

format +

= 2;

}else

}va_end

(arg);

return done;

}int main(

int argc,

char

* argv)

編譯執行,結果如下:

[ray@localhost c++]

$ gcc -o printf printf.c 

[ray@localhost c++]

$./printf 

n = 255

n = 255

n = 377

n = ff

first char = h

str = hello,

hello, n = 255--

----

----

----

-my_printf---

----

----

---n = 255

n = 255

n = 377

n = ff

first char = h

str = hello,

hello, n = 255

**:

實現自己的printf函式

在嵌入式開發中,常常會通過串列埠列印一些資訊到pc終端,這就需要實現自己的printf函式,下面介紹列印函式print的實現。print.h cpp view plain copy print?ifndef print h define print h void print char fmt,voi...

變參函式實現細節

c語言的函式雖然不具備c 的多型性,但也可以接受引數不確定的情況,當然,c語言中的變參函式實際在功能上是受限的,廢話不多講,下面來看看變參函式的邊邊角角的問題。討論之前我們來看一下最熟悉的變參函式printf的原型宣告 int printf const char format,注意到,在函式中宣告其...

關於printf函式及變引數函式實現

printf函式一直都是乙個很強大的函式,它的變引數是怎麼實現的?一直是乙個困擾我的問題。經過查詢資料,了解了這是一類c語言通用的問題 變引數函式的實現。要實現這種機制,必須要現了解4個巨集定義 va list,va start,va arg,va end。下面給出這四個巨集定義在c語言中的實現 在...