C语言日常小练习(造轮子)-1.8

可变参数函数顾名思义,就是函数参数个数是未知的是可变的。

(1)可变参数列表是通过宏来实现的,这些宏定义在stdarg.h 这个头文件中,这个头文件声明了一个类型va_list和三个宏——va_start , va_arg,  va_end.

(2)比如定义一个可变参数函数

void print(char *fomt, ...)

va_list:声明一个变量//va_list arg;
va_start:初始化va_list声明的这个变量,它的第一个参数是va_list声明的变量另外一个参数是省略号前最后一个有名字的参数
//va_start(arg,fomt);
初始化过程就是把参数列表的第一个参数给va_list声明的这个变量。
va_arg:我们就是通过这个来访问未知参数的,va_arg的一个参数是va_list声明的这个变量,另一个参数列表中下一个要接收的参数类型//va_arg(arg,char);
va_end:释放空间

1.一个函数可以求任意多个数的平均值(使用可变参数列表)
#include<stdio.h>   
#include <stdarg.h>   

int average(int num, ...)
{
	va_list arg;  //定义一个va_list类型的变量,用于访问参数列表的未确定部分  
	va_start(arg, num);  
	int sum = 0;
	for (int i = 0; i < num; i++){
		sum += va_arg(arg, int);   
	}
	va_end(arg); 
	return sum / num;
}

int main()
{
	int a = 1;
	int b = 3;
	int aver1 = average(3, 2, 3, a); 
	int aver2 = average(4, 5, a, b, 8);
	printf("aver1 = %d\n", aver1);
	printf("aver2 = %d\n", aver2);

	system("pause");
	return 0;
}

2.使用可变参数,实现函数,求函数参数的最大值。

#include <stdio.h>  
#include <stdarg.h>  
#include <windows.h>  

int isMax(int n, ...)
{
	int max = 0;
	va_list arg;
	va_start(arg, n);

	for (int i = 0; i < n; i++){
		int val = va_arg(arg, int);
		if (val > max){
			max = val;
		}
	}

	va_end(arg);
	return max;
}
int main()
{
	int ret = isMax(5, 1, 2, 3, 4, 5);
	printf("%d\n", ret);

	system("pause");
	return 0;
}

3..模拟实现printf函数,可完成下面的功能
//能完成下面函数的调用。
//print("s ccccc d \n", "hello", 'w', 'o', 'r', 'l', 'd', 100);
//函数原型:
//print(char *tmp, ...)

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <windows.h>

void print(char *tmp, ...)   //实现可变形参
{
	va_list arg;        //声明va_list类型的变量arg,用于访问参数列表的未确定部分
	va_start(arg, tmp); //调用va_start来初始化。初始化过程把arg变量设置为指向可变参数部分的第一个参数。
	while (*tmp != '\0')//它的第一个参数是va_list的变量名,第2个参数是省略号前最后一个有名字的参数。
	{
		if (*tmp == 'c')
		{
			putchar(va_arg(arg, char));//定义va_arg来访问参数,这个宏接受两个参数:va_list变量和参数列表中下一个参数的类型。
		}
		else if (*tmp == 's')
		{
			puts(va_arg(arg, char*));
		}
		else if (*tmp == 'd')
		{
			int d = va_arg(arg, int);
			printf("%d\n", d);
		}
		tmp++;
	}
	va_end(arg);     //当访问完最后一个可变参数之后,我们需要调用va_end。
}
int main()
{
	print("s ccccc d \n", "hello", 'w', 'o', 'r', 'l', 'd', 100);

	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39026129/article/details/80259563