? ? 为了访问参数,需要使用va_arg,这个宏接受两个参数(va_list变量和参数列表中下一个参数的类型)访问完最后一个参数,需要调用va_end(),其格式如下:
?
void fun(int a,...)
{
va_list parameter;
va_start(parameter, a);
va_arg(parameter, int );
}
?
?
? ? 举个例子,如果要实现求多个数的平均值,因为C中不允许默认参数,所以只能用上述方法进行求平均数,代码如下
?
int average(int val, ...)
{
va_list arg;
int sum = 0;
int i = 0;
va_start(arg, val);
//va_arg();
for (i = 0; i < val; i++)
{
sum += va_arg(arg, int);//每调用一次向下取一个
}
va_end(arg);
return sum / val;
}
?
?
? 如果要求多个数的最大值可以写为
?
int average(int val, ...)
{
va_list arg;
int max;
int sum = 0;
int i = 0;
va_start(arg, val);
for (i = 0; i < val; i++)
{
sum = va_arg(arg, int);
if (sum>max)
max = sum;
}
va_end(arg);
return max;
}
?
?
? 由此我们还可以用stdarg这个宏来模拟printf函数的实现,这里我只是做了模拟了字符串输出,整形与字符型输出代码如下:
?
#include#include void printd(int n)//把整形按字符型输出 { if (n < 0) { 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 '%': //遇到%执行switch case语句 { if (*(val + 1) == 'c')//输出字符 { ch = va_arg(arg, char); putchar(ch); val++; //指针变量向下偏移一个单位 } 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++; //指向头一变量的下一个字符 } else putchar('%'); break; } default: { putchar(*val); break; } } val++; } va_end(arg); } int main() //程序调试 { int c =100 ; char*p = "laomasb"; char a = 'c'; my_printf("%s\n%d\n%c\n", p, c,a); system("pause"); return 0; }
?
?
? ? 这里写得还差很多,比如说%后面加数字的话是没办法识别并且寇冲输出空间的,而且这代码自己看着就比较low。希望大神给出些建议。