关于函数里面的...

文章介绍了C语言中的可变参数列表,包括`va_list`、`va_start`、`va_arg`和`va_end`的使用,展示了如何通过省略号参数实现日志打印、求和和平均值计算等功能,同时强调了处理这类参数时需要注意的问题。
摘要由CSDN通过智能技术生成

写一写最近的收获把,一个新知识,在使用串口控制遥控器时候

#include <stdarg.h>,算是最近对于c语言的新认识,对于这个库

在C语言中,“...”表示函数的可变参数列表(variable arguments)。也称作“省略号参数”,允许我们定义一个函数,该函数可以接受任意数量的参数。

在你提供的函数定义中,省略号参数类型为“const char *fmt”,它是一个指向格式化字符串的指针。这个函数可以接受任意数量的参数,并且使用这个格式化字符串将这些参数格式化为一个字符串。

例如,如果你想打印一个带有两个整数的字符串,你可以这样调用该函数:

usart_printf("The two numbers are: %d and %d", num1, num2);

在这个例子中,格式化字符串为“The two numbers are: %d and %d”,其中的“%d”表示需要插入整数值。num1和num2是两个整数变量,在调用该函数时会被传递进去。该函数会根据格式化字符串将这两个整数格式化为一个字符串,并通过USART发送出去。

通过使用省略号参数,可以使函数更加灵活,可以处理不同数量和类型的参数。但是需要注意的是,在使用可变参数列表时,需要非常小心地处理参数,以避免可能的问题,如内存泄漏、无法正确解析参数等。

在多举几个例子

第一个:

当编写一个接受可变参数列表的函数时,常见的例子是实现一个简单的日志打印函数,类似于printf函数。以下是一个示例:

 

#include <stdio.h>
#include <stdarg.h>

void log_print(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);

    vprintf(fmt, args);

    va_end(args);
}

int main()
{
    int num = 42;
    float f = 3.14;
    const char *str = "Hello, World!";

    log_print("The number is: %d\n", num);
    log_print("The float value is: %.2f\n", f);
    log_print("The string is: %s\n", str);

    return 0;
}

 

在上面的例子中,我们定义了一个log_print函数,它接受一个格式化字符串(fmt)和可变参数列表(...)。函数内部使用了va_list、va_start、vprintf和va_end这几个宏和函数来处理可变参数。

在main函数中,我们使用log_print函数来打印不同类型的数据:整数、浮点数和字符串。通过传递不同的格式化字符串和参数,log_print函数可以根据格式化字符串将其格式化为相应的输出,并打印到标准输出。

注意,在使用可变参数列表时,我们需要使用va_start宏来初始化参数列表,使用vprintf函数来打印格式化字符串和参数,最后使用va_end宏来结束参数列表的处理

第二个:

除了日志打印函数,可变参数列表还可以用于实现其他类型的函数,以下是一些例子:

实现一个函数,返回其所有参数的和。

#include <stdarg.h>

int sum(int count, ...)
{
    va_list args;
    va_start(args, count);

    int result = 0;
    for (int i = 0; i < count; i++) {
        int num = va_arg(args, int);
        result += num;
    }

    va_end(args);
    return result;
}

int main()
{
    int s1 = sum(3, 1, 2, 3);  // 返回6
    int s2 = sum(5, 10, 20, 30, 40, 50);  // 返回150

    return 0;
}

在上面的例子中,我们定义了一个sum函数,该函数接受一个整数count和可变参数列表(...)。函数内部使用了va_list、va_start、va_arg和va_end这几个宏和函数来处理可变参数。

在main函数中,我们使用sum函数来计算不同数量的整数之和,sum函数会遍历所有的参数并将它们相加,然后返回总和

第三个:

实现一个函数,计算n个整数的平均值。

#include <stdarg.h>

double average(int n, ...)
{
    va_list args;
    va_start(args, n);

    double total = 0.0;
    for (int i = 0; i < n; i++) {
        int num = va_arg(args, int);
        total += num;
    }

    va_end(args);

    return total / n;
}

int main()
{
    double a1 = average(4, 2, 4, 6, 8);  // 返回5.0
    double a2 = average(3, 10, 20, 30);  // 返回20.0

    return 0;
}

在上面的例子中,我们定义了一个average函数,该函数接受一个整数n和可变参数列表(...)。函数内部使用了va_list、va_start、va_arg和va_end这几个宏和函数来处理可变参数。

在main函数中,我们使用average函数来计算不同数量的整数的平均值,average函数会遍历所有的参数并将它们相加,然后返回平均值。

这些都是使用可变参数列表实现的一些简单函数,实际上在开发中还有很多其他的应用场景。使用可变参数列表可以使函数更加灵活,可以处理不同数量和类型的参数。但是需要注意,在使用可变参数列表时,需要非常小心地处理参数,以避免可能的问题,如内存泄漏、无法正确解析参数等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值