可变参数心得
例子
- 使用可变参数,实现函数,求函数参数的平均值。
#include<stdio.h>
#include <stdarg.h>
int my_average(int n, ...)
{
va_list arg;
int result = 0;
int i = 0;
va_start(arg, n);
while(i<n)
{
result += va_arg(arg, int);
i++;
}
va_end(arg);
return result/n;
}
int main(){
int a = 2;
int b = 3;
int c = 4;
printf("%d\n", my_average(3, a, b, c));
return 0;
}
- 使用可变参数,实现函数,求函数参数的最大值。
#include<stdio.h>
#include<stdarg.h>
int my_max(int n, ...)
{
va_list arg;
int max = 0;
int i = 1;
int tmp;
va_start(arg, n);
max = va_arg(arg, int);
while(i<n)
{
tmp = va_arg(arg, int);
if(max < tmp) max = tmp;
i++;
}
va_end(arg);
return max;
}
int main(){
int a = 2;
int b = 102;
int c = 5;
printf("%d\n", my_max(3, a, b, c));
return 0;
}
- 模拟实现printf函数,可完成下面的功能
能完成下面函数的调用。
print(“s ccc d.\n”,”hello”,’b’,’i’,’t’,100);
函数原型:
print(char *format, …)
#include<stdio.h>
#include <stdarg.h>
void print(char *format, ...)
{
va_list arg;
char *p = format;
va_start(arg, format);
while(*p != '\0')
{
if(*p == 's')
{
printf("%s", va_arg(arg, char *));
}
else if(*p == 'c')
{
printf("%c", va_arg(arg, char));
}
else if (*p == 'd')
{
printf("%d", va_arg(arg, int));
}
else if (*p == '\n')
{
printf("\n");
}
else printf(" ");
p++;
}
va_end(arg);
}
int main(){
print("s ccc d.\n","hello",'b','i','t', 100);
return 0;
}
总结
怎么用
可变参数函数的用法形如printf()、scanf()。
怎么写
对于可变参数这块儿, 需要注意引头文件stdarh.h。
第一个参数必须是确定的,第二个参数用…表示。
定义可变参数函数时,需要使用以下几个特殊“关键词”
va_list 这是一种类型,叫做 va_list 类型。
va_start 用于初始化 va_list 变量。参数为 va_list 变量。
va_arg 用于从传进来的“不确定”的参数集合中取下一个值, 它有两个参数,第一个是 va_list 变量, 第二个是下一个值的类型。
va_end 当访问完毕最后一个可变参数之后,需要调⽤ va_end 来确保堆栈的正确恢复。参数为 va_list 变量。