【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;  
}  
二、编译运行结果
 

 

 

 

posted @ 2023-02-10 14:36  opensmarty  阅读(31)  评论(0编辑  收藏  举报