C语言的可变参数函数理解与应用

一、可变参数函数的理解

  1. 官方定义:C语言允许定义参数数量为可变的函数,这称为可变参数函数。它与传统意义上的强制定义固定参数的函数不同。
  2. 可变参数函数应用最广的是格式化输入输出函数。如printf,scanf。可支持任意参数输入输出。
  3. 可变参数函数可有助于我们封装printf函数。例如,可以指定打印到控制台或文件中。

二、可变参数函数的应用

        1、可变参数的常规打印

        直接参考代码,注释写的很清楚了。

        代码的核心也是通过vprintf打印到控制台。

#include <stdlib.h>
#include <stdio.h>
// 可变参数的头文件
#include <stdarg.h>

// 默认为打印到控制台
void script_log_error(char *fmt, ...)
{
    // 定义可变参数列表
    va_list ap;
    // 获取不定参数的首地址,首地址是从fmt开始
    va_start(ap, fmt);
    // 打印可变参数
    printf("数据为:");
    vprintf(fmt, ap);
    // 结束
    va_end(ap);

    printf("\n");
}

int main()
{
    // 使用可变参数的函数打印
	script_log_error("type is_3:%f,%s,%d hunhe5", 362.01, "123654", 50);
    script_log_error("type is_5: no data");
}

        2、可变参数的解析并打印

        解析主要分四步处理:

                1.通过循环遍历的方式,解析每个输入字符

                2.把%d、%f、%s作为关键字解析,并获取对应的数据。

                3.把修饰性字符与实际数据都转换成字符串并存储于二维数组中。

                4.把二维数组中的内容转换到一维数组中,然后打印一维数组。

#include <stdlib.h>
#include <stdio.h>
// 可变参数的头文件
#include <stdarg.h>

void script_dzlog_error(char *fmt, ...)
{
    va_list ap;
    char *p, *sval;
    int ival;
    double dval;
    // 存储修饰性字符
    char data_val[256] = {0};
    // 存储每一段数据
    char data[10][256] = {0};

    int idx_d1 = 0;
    int cnt_v = 0;

    // 获取不定参数的首地址,首地址是从fmt开始
    va_start(ap, fmt);
    for (p = fmt; *p; p++) {
        if(*p != '%') {
            // 获取修饰性字符
            data_val[cnt_v++] = *p;
            continue;
        }
        switch(*++p) {
        case 'd':
        {
            ival = va_arg(ap, int);
            char tmp[128] = {0};

            // 把修饰性字符复制到data中
            memcpy(&data[idx_d1++][0], data_val, sizeof(data_val));
            // 清空data_val
            memset(data_val, 0x00, sizeof(data_val));
            cnt_v = 0;

            // 把数据型字符复制到data中
            my_itoa(ival, tmp);
            memcpy(&data[idx_d1++][0], tmp, sizeof(tmp));

            break;
        }
        case 'f':
        {
            dval = va_arg(ap, double);
            char tmp[128] = {0};

            // 把修饰性字符复制到data中
            memcpy(&data[idx_d1++][0], data_val, sizeof(data_val));
            // 清空data_val
            memset(data_val, 0x00,
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值