C語言可變形參
??C語言允許定義參數(shù)數(shù)量可變的函數(shù),這稱為可變參數(shù)函數(shù)(variadic function)。這種函數(shù)需要固定數(shù)量的強(qiáng)制參數(shù)(mandatory argument),后面是數(shù)量可變的可選參數(shù)(optional argument)。
1.可變形參相關(guān)函數(shù)
#include
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);
?va_start完成ap指針初始化,以供va_arg和va_end后續(xù)使用,該函數(shù)必須先調(diào)用。參數(shù)last是變量參數(shù)列表前最后一個參數(shù)的名稱;
va_arg實現(xiàn)下一個參數(shù)的類型和值的獲取。參數(shù)ap是由va_start初始化的參數(shù)列表。對va_arg()的每次調(diào)用都會修改ap,以便獲取下一個參數(shù)。參數(shù)類型type是一個指定的數(shù)據(jù)類型。
va_end將ap指向NULL。
va_copy將參數(shù)列表src復(fù)制到dest中,該函數(shù)在c99才有定義。
2.可變形參模仿printf函數(shù)
#include
#include
void my_printf(const char *fmt,...);
int main()
{
my_printf("%s\n","123456");
my_printf("%d %%\n",55);
my_printf("%f\n",789.56);
my_printf("%c\n",'c');
my_printf("%ld,%lf\n",1234567890123,45.789625);
}
void my_printf(const char *fmt,...)
{
va_list ap;
va_start(ap,fmt);//ap=fmt
char c,*s;
int d;
float f;
long l;
double b;
while(*fmt)
{
if(*fmt!='%')
{
putchar(*fmt);//輸出%前所有字符
}
else
{
fmt++;//跳過%
switch(*fmt)
{
case 'c'://字符
c=(char )va_arg(ap,int);//字符存儲時按int空間處理
fprintf(stdout,"%c",c);
break;
case 'd'://整數(shù)
d=va_arg(ap,int);
fprintf(stdout,"%d",d);
break;
case 'f'://浮點數(shù)
f=(float)va_arg(ap,double);//浮點數(shù)據(jù)處理時按double處理
fprintf(stdout,"%f",f);
break;
case '%'://%%
putchar(*fmt);
break;
case 's'://字符串
s=va_arg(ap,char *);
fprintf(stdout,"%s",s);
break;
case 'l':
fmt++;
if(*fmt=='d')//長整形%ld
{
l=va_arg(ap,long);
fprintf(stdout,"%ld",l);
}
else if(*fmt=='f')//雙精度浮點型%lf
{
b=va_arg(ap,double);
fprintf(stdout,"%lf",b);
}
break;
}
}
fmt++;
}
va_end(ap);//ap=NULL
}
??運行效果:
[wbyq@wbyq 0414work]$ gcc main.c
[wbyq@wbyq 0414work]$ ./a.out
123456
55 %
789.559998
c
1234567890123,45.789625
審核編輯 黃昊宇
-
C語言
+關(guān)注
關(guān)注
180文章
7605瀏覽量
136894
發(fā)布評論請先 登錄
相關(guān)推薦
評論