【c&c++】C语言可变参数个数的函数学习
C语言可变参数个数的函数学习
一、学习测试C代码
#include <stdio.h> #include <stdarg.h> void fixed_args_func(int a, double b, char *c,int d) { printf("a = 0x%p\n", &a); printf("b = 0x%p\n", &b); printf("c = 0x%p\n", &c); printf("d = 0x%p\n", &d); } float average(int n, ...) { va_list args;//接收可变参数,实际上它属于char* typedef char * va_list; int i = 0; float sum = 0; va_start(args, n);//处理接收到的“字符串” for (i = 0; i<n; i++) { sum += va_arg(args, int);//依次访问参数,需指定按照什么类型读取数据 } va_end(args);//参数使用结束 return sum / n; } void minprintf(char *fmt, ...) { va_list ap; char *p, *sval; int ival; double dval; va_start(ap, fmt); for (p = fmt; *p; p++) { if(*p != '%') { putchar(*p); continue; } switch(*++p) { case 'd': ival = va_arg(ap, int); printf("%d", ival); break; case 'f': dval = va_arg(ap, double); printf("%f", dval); break; case 's': for (sval = va_arg(ap, char *); *sval; sval++) putchar(*sval); break; default: putchar(*p); break; } } va_end(ap); } void foo(char *fmt, ...) { va_list ap; int d; char c, *s; va_start(ap, fmt); while (*fmt) switch (*fmt++) { case 's': /* string */ s = va_arg(ap, char *); printf("string %s\n", s); break; case 'd': /* int */ d = va_arg(ap, int); printf("int %d\n", d); break; case 'c': /* char */ /* need a cast here since va_arg only takes fully promoted types */ c = (char) va_arg(ap, int); printf("char %c\n", c); break; } va_end(ap); } int main() { int a=100; double b=200; char *c='c'; int d=300; fixed_args_func(a, b, c, d); printf("%f\n", average(5, 1, 2, 3, 4, 5)); printf("%f\n", average(4, 1, 2, 3, 4)); minprintf("miniprintf is %s %s %d \n","the ","number is ",520) ; foo("foo %s %d %d %d %c %d", "foo string is ",520,111,19870214,'Y',520111); return 0; }
二、编译运行结果