今天,博主学习了可变参数列表,有了这个工具呢,我们就可以自己实现类似于printf这样的函数了呢,可以自定义函数的参数个数了。

可变参数列表可以通过宏来实现,这些宏定义在stdarg.h头文件中,它是标准库的一部分。这个头文件中声明了一个类型va_list和三个宏——va_start,va_arg,va_end。

下面我来介绍几个例子,我们一起来看看他的用法。

1.求几个参数的平均数

#include<stdio.h>
#include<stdarg.h>
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;

}