步骤:
1.定义一个va_list类型的变量 arg。
2.宏va_start(arg,num)---这个宏有两个参数,第一个参数为va_list类型的变量,第二个参数为可变参数列表之前的参数。作用就是使得 va_list 的变量指向可变参数列表的首地址。这才是一般意义上的对 va_list的初始化。
3.宏va_arg(arg,int) ---第一个参数为va_list类型的变量第二个为参数的类型。
4.宏va_end(arg)---结束标志
使用可变参数,实现函数,求函数参数的平均值。
使用可变参数,实现函数,求函数参数的最大值。#define _CRT_SECURE_NO_WARNINGS 0 #include <stdio.h> #include <windows.h> int average(int n, ...) { va_list arg; int i = 0; int sum = 0; va_start(arg, n); for (i = 0; i < n; i++) { sum += va_arg(arg, int); } return sum / n; va_end(arg); } int main() { int a = 2; int b = 4; int c = 6; int d = 8; int e = 10; int avg1 = average(3, a, b, c); int avg2 = average(5, a, b, c, d, e); printf("avg1 = %d\n", avg1); printf("avg2 = %d\n", avg2); system("pause"); return 0; }
模拟实现printf函数#define _CRT_SECURE_NO_WARNINGS 0 #include <stdio.h> #include <windows.h> int Max(int n, ...) { va_list arg; int i = 0; int max = 0; va_start(arg, n); for (i = 0; i < n; i++) { int val = va_arg(arg, int); if (val > max) { max = val; } } return max; va_end(arg); } int main() { int a = 2; int b = 4; int c = 6; int d = 8; int e = 10; int max1 = Max(3, a, b, c); int max2 = Max(5, a, b, c, d, e); printf("avg1 = %d\n", max1); printf("avg2 = %d\n", max2); system("pause"); return 0; }
函数原型:
printf(char *format, ...)
#define _CRT_SECURE_NO_WARNINGS 0 #include <stdio.h> #include <windows.h> #include <assert.h> int my_printf(const char *format, ...) { assert(format); //判断是否为空 va_list arg; //定义arg变量 va_start(arg, format); //初始化变量 while (*format) { if (*format == '%') { format++; switch (*format) { case 's': { char *s = va_arg(arg, char*); puts(s); } break; case 'd': { int i = va_arg(arg, int); } break; case 'c': { char c = va_arg(arg, char); putchar(c); } break; case 'f': { float f = va_arg(arg, float); } break; case '%': { putchar('%'); } break; default: puts("format error!\n"); return; } } else if (*format == '\\') { format++; if (format == 'n') { puts("\n"); } } else { putchar(*format); } format++; } va_end(arg); //结束 return 0; } int main() { char c = 'c'; char *s = "world"; my_printf("hello %c, hello %s\n", c, s); my_printf("hello %c\nhello %s\n", c, s); system("pause"); return 0; }