C语言中可变参数的写法

在C语言中要想实现可变参数的写法,就要先知道stdarg这个头文件中的两个宏va_start,va_arg,va_end以及一个类型va_list。

va_list这个类型用于声明一个可变参数的列表指针。

va_start用于初始化可变参数列表指针,令它指向可变参数列表的第一个值。

va_arg用于返回参数的值,并且令可变参数的列表的指针指向下一个参数。

va_end用于结束可变参数指针。

在声明函数的时候则需要这样做:

void Variable_parameter_function(int num,...);

综上所述,通过一个就平均数的函数做例子:
 

#include "stdio.h"
#include "stdarg.h"
float Average(int num,...){
    va_list Para_list;    //声明一个可变参数列表指针
    int cnt;
    float sum;
    va_start(Para_list,num);    //初始化可变参数列表指针,使其指向紧跟num后的那个参数
    for(cnt=0;cnt<num;cnt++){
        sum += va_arg(Para_list,int);    //将可变参数列表中的值以int类型返回,并将可变参数列 
                                         //表指针指向下一个值。
        
    }
    va_end(Para_list);
    return sum/num;
}

接下来就来试着写一下自己的printf函数,首先printf的用法是printf("Output_int:%d,Output_char:%c,Out_put_str:%s",i,c,s);

按照可变参数函数的写法,上面printf函数的变化部分就是后面的变量部分,而第一部分实际上就是一个字符串,

所以我们的printf函数声明就是:

void myprintf(char * string,...){
    va_list ap;
    va_start(string,ap);
    int i;
    char c;
    char* s;
    while( string != NULL){
        if (* string != '%'){
             putchar(*string);
               string++;   
        }
        else{
            switch(* string ){
                case 'd':
                    i=va_arg(ap,int);
                    putint(i); 
                    string++;        
                break;
                case 'c':
                    c=va_arg(ap,char);
                    putchar(c);
                    string++; 
                break;
                case 's':
                    s=va_arg(ap,char *);
                    putstring(ap,s);
                    string++; 
                break;
                default:
                    string++;
            }
        }
    }
    va_end(ap);

}

以上仅仅是一个很简陋的printf的实现方式,并不是很完美,但是足以用来说明可变参数函数的写法了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值