va_list原理及使用方法

简介

VA_LIST 是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活.

va_list使用方法

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

void pInt(int a){
	printf("%d", a);
}
void pFoat(double a){
	printf("%f", a);
}
/* 取最大值 */
int get_max(int n_values,...){
	va_list var_arg;
	int count = 0;
	int max = 0;

	va_start(var_arg, n_values);
	int i = 0;

	for(i = 0; i<n_values; i++){
		int cur = va_arg(var_arg, int);
		if(cur > max)
			max = cur;
	}
	va_end(var_arg);
	return max;
}
void listPrint(int n, ...){
	va_list args;
	int i = 0;
	va_start(args, n);
	for(; i < n; i++){
		printf("%d ", va_arg(args, int));
	}
	va_end(args);
	return;
}

void printFmt(const char* fmt, ...){
	va_list var_arg;
	va_start(var_arg, fmt);
	const char *p = NULL;
	const char *q = NULL;
	const char *temp = NULL;
	for(p = fmt; p < &fmt[strlen(fmt)]; p++){
		if(*p == '%')
		{
			switch(*++p)
			{
				case 'c':
					putchar(va_arg(var_arg, char));
					break;
				case 's':
					for(temp = va_arg(var_arg, char *), q = temp; q < temp + strlen(temp); q++){
						putchar(*q);
					}
					break;
				case 'd':
					pInt(va_arg(var_arg, int));
					break;
				case 'f':
					pFoat(va_arg(var_arg, double));
					break;
			}
		}
		if(*p == ' ') putchar(' ');
	}
	va_end(var_arg);
}

int main(int argc, char *argv[]){
	int nums = 3, b = 3, c = 5, d = -1;
	int res = get_max(nums, b, c, d);
	printf("%d\n", res);
	return 0;
	}