今天,博主学习了可变参数列表,有了这个工具呢,我们就可以自己实现类似于printf这样的函数了呢,可以自定义函数的参数个数了。
可变参数列表可以通过宏来实现,这些宏定义在stdarg.h头文件中,它是标准库的一部分。这个头文件中声明了一个类型va_list和三个宏——va_start,va_arg,va_end。
下面我来介绍几个例子,我们一起来看看他的用法。
1.求几个参数的平均数
#include#include int average(int val, ...){ int i = 0; float sum = 0.0f; va_list arg; //类型名 va_start(arg, val); //val为参数个数 for (i = 0; i < val; i++){ sum += va_arg(arg, int); //逐个取int型的的参数 } va_end(arg); //结束 return sum / val;}int main(){ float ret = average(5, 1, 2, 3, 4, 5); printf("%f\n", ret); return 0;}
2.求参数中的最大值
#include<stdio.h>
#include<stdarg.h>
int find_max(int val, ...){
int i = 0;
int max = 0;;
va_list arg;
va_start(arg, val);
for (i = 0; i < val; i++){
int tmp = va_arg(arg, int);
if (tmp>max)
max = tmp;
}
va_end(arg);
return max;
}
int main(){
int ret = find_max(5, 1, 2, 4, 4, 4);
printf("%d\n", ret);
return 0;
}
3.实现类似printf功能的打印函数
#include<stdio.h>
#include<stdarg.h>
#include<string.h>
void print(const char* format, ...){//format用来接收字符格式
char tmp = 0;
int i = 0;
va_list arg;
va_start(arg, format);
while (*format){
switch (*format)
{
case 'c':{ //当接收到%c时,将单个字符输出
tmp = va_arg(arg, char);
putchar(tmp);
break;
}
case's':{ /当接收到%s时,将字符串输出
char *ret = va_arg(arg, char*);
int len = strlen(ret);
for (i = 0; i < len; i++){
putchar(ret[i]);
}
break;
}
default: //其他默认输出
putchar(*format);
break;
}
format++;
}
va_end(arg);
}
int main(){
print("csc\n",'G',"hello",'r');
return 0;
}