在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語言中的實現 在...