3.14之可变参数

17 篇文章 0 订阅

可变参数心得

例子

  1. 使用可变参数,实现函数,求函数参数的平均值。
#include<stdio.h>
#include <stdarg.h>
int my_average(int n, ...)
{
    va_list arg;
    int result = 0;
    int i = 0;
    va_start(arg, n);
    while(i<n)
    {
        result += va_arg(arg, int);
        i++;
    }
    va_end(arg);
    return result/n;
}
int main(){
    int a = 2;
    int b = 3;
    int c = 4;
    printf("%d\n", my_average(3, a, b, c));
    return 0;
}
  1. 使用可变参数,实现函数,求函数参数的最大值。
#include<stdio.h>
#include<stdarg.h>

int my_max(int n, ...)
{
    va_list arg;
    int max = 0;
    int i = 1;
    int tmp;
    va_start(arg, n);
    max = va_arg(arg, int);
    while(i<n)
    {
        tmp = va_arg(arg, int);
        if(max < tmp) max = tmp;
        i++;
    }
    va_end(arg);
    return max;
}


int main(){
    int a = 2;
    int b = 102;
    int c = 5;
    printf("%d\n", my_max(3, a, b, c));
    return 0;
}
  1. 模拟实现printf函数,可完成下面的功能

能完成下面函数的调用。
print(“s ccc d.\n”,”hello”,’b’,’i’,’t’,100);
函数原型:
print(char *format, …)

#include<stdio.h>
#include <stdarg.h>
void print(char *format, ...)
{
    va_list arg;
    char *p = format;
    va_start(arg, format);
    while(*p != '\0')
    {
        if(*p == 's')
        {
            printf("%s", va_arg(arg, char *));
        }
        else if(*p == 'c')
        {
            printf("%c", va_arg(arg, char));
        }
        else if (*p == 'd')
        {
            printf("%d", va_arg(arg, int));
        }
        else if (*p == '\n')
        {  
            printf("\n");
        }
        else printf(" ");
        p++;
    }
    va_end(arg);
}

int main(){
    print("s ccc d.\n","hello",'b','i','t',  100); 
    return 0;
}

总结

怎么用

可变参数函数的用法形如printf()、scanf()。

怎么写

对于可变参数这块儿, 需要注意引头文件stdarh.h。

第一个参数必须是确定的,第二个参数用…表示。

定义可变参数函数时,需要使用以下几个特殊“关键词”
va_list 这是一种类型,叫做 va_list 类型。

va_start 用于初始化 va_list 变量。参数为 va_list 变量。

va_arg 用于从传进来的“不确定”的参数集合中取下一个值, 它有两个参数,第一个是 va_list 变量, 第二个是下一个值的类型。

va_end 当访问完毕最后一个可变参数之后,需要调⽤ va_end 来确保堆栈的正确恢复。参数为 va_list 变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值