c语言int val,c语言不定参数与printf函数的实现
今天學(xué)習(xí)了C語(yǔ)言不定參數(shù),C語(yǔ)言中的不定參數(shù)主要靠這個(gè)頭文件實(shí)現(xiàn),這個(gè)頭文件包含了va_list()、va_start()、va_end()三個(gè)宏,其用法為先聲明一個(gè)va_list類型的變量,它用于訪問(wèn)參數(shù)列表未確定的部分。這個(gè)變量是由va_start來(lái)初始化的。它的第一個(gè)參數(shù)是va_list的變量名,第二個(gè)參數(shù)是省略號(hào)前最后一個(gè)有名字的參數(shù)。初始化過(guò)程把va_list的變量設(shè)置為指向可變參數(shù)的第一個(gè)參數(shù)。
為了訪問(wèn)參數(shù),需要使用va_arg,這個(gè)宏接受兩個(gè)參數(shù)(va_list變量和參數(shù)列表中下一個(gè)參數(shù)的類型)訪問(wèn)完最后一個(gè)參數(shù),需要調(diào)用va_end(),其格式如下:void?fun(int?a,...)
{
va_list?parameter;
va_start(parameter,?a);
va_arg(parameter,?int?);
}
舉個(gè)例子,如果要實(shí)現(xiàn)求多個(gè)數(shù)的平均值,因?yàn)镃中不允許默認(rèn)參數(shù),所以只能用上述方法進(jìn)行求平均數(shù),代碼如下int?average(int?val,?...)
{
va_list?arg;
int?sum?=?0;
int?i?=?0;
va_start(arg,?val);
//va_arg();
for?(i?=?0;?i?
{
sum?+=?va_arg(arg,?int);//每調(diào)用一次向下取一個(gè)
}
va_end(arg);
return?sum?/?val;
}
如果要求多個(gè)數(shù)的最大值可以寫(xiě)為int?average(int?val,?...)
{
va_list?arg;
int?max;
int?sum?=?0;
int?i?=?0;
va_start(arg,?val);
for?(i?=?0;?i?
{
sum?=?va_arg(arg,?int);
if?(sum>max)
max?=?sum;
}
va_end(arg);
return?max;
}
由此我們還可以用stdarg這個(gè)宏來(lái)模擬printf函數(shù)的實(shí)現(xiàn),這里我只是做了模擬了字符串輸出,×××與字符型輸出代碼如下:#include
#include
void?printd(int?n)//把×××按字符型輸出
{
if?(n?
{
putchar('-');
}
if?(n)
{
printd(n?/10);
putchar(n?%?10?+?'0');
}
}
void?my_printf(char*?val,...)
{
int?ch;
va_list?arg;
va_start(arg,?val);
while?(*val?!=?'\0')
{
switch?(*val)
{
case?'%':????????????//遇到%執(zhí)行switch?case語(yǔ)句
{
if?(*(val?+?1)?==?'c')//輸出字符
{
ch?=?va_arg(arg,?char);
putchar(ch);
val++;????????????????//指針變量向下偏移一個(gè)單位
}
else?if?(*(val?+?1)?==?'d')
{
ch?=?va_arg(arg,?char);//輸出×××
printd(ch);
val++;
}
else?if?(*(val?+?1)?==?'s')//輸出字符串
{
char*p?=?va_arg(arg,?char*);
while?(*p?!=?'\0')
{
putchar(*p);
p++;
}
val++;????????????????//指向頭一變量的下一個(gè)字符
}
else
putchar('%');
break;
}
default:
{
putchar(*val);
break;
}
}
val++;
}
va_end(arg);
}
int?main()????????????//程序調(diào)試
{
int?c?=100?;
char*p?=?"laomasb";
char?a?=?'c';
my_printf("%s\n%d\n%c\n",?p,?c,a);
system("pause");
return?0;
}
這里寫(xiě)得還差很多,比如說(shuō)%后面加數(shù)字的話是沒(méi)辦法識(shí)別并且寇沖輸出空間的,而且這代碼自己看著就比較low。希望大神給出些建議。
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的c语言int val,c语言不定参数与printf函数的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 将一个c 语言源程序文件中所有注释去掉后
- 下一篇: c语言程序设计2014春第一套作业,C语