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;  
}  


二、编译运行结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值