首页 > 编程语言 >【C/C++】 可变参数函数

【C/C++】 可变参数函数

时间:2023-04-24 16:37:51浏览次数:45  
标签:va 函数 hint fmt args C++ char 参数 可变

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

/**
 * 按自定义格式符解析数据
 */
void process(const char *fmt, va_list args)
{
    for (; *fmt; fmt++) {
        if (*fmt == '%') {
            continue;
        }

        switch (*fmt) {
            case 'a': {
                char *str = va_arg(args, char *);
                printf("%s\n", str);
                continue;
            }
            case 'b': {
                float *num = va_arg(args, float *);
                printf("%f\n", *num);
                continue;
            }
            case 'f': {
                float num = va_arg(args, double);  // 解析浮点数须用double,不能用float
                printf("%f\n", num);
                continue;
            }
            default:continue;
        }
    }
}

/**
 * 自定义可变参数函数
 * @param  hint: 传递给函数的额外参数
 * @param  fmt:  自定义格式符
 */
void VariadicFunction(char *hint, const char *fmt, ...)
{
    // 定义有个参数列表
    va_list args;
    // 初始化列表参数args,第二个参数可变参数前的第一个固定参数,即略号前的第一个参数
    va_start(args, fmt);
    // 解析数据
    process(fmt, args);
    // 释放可变参数列表
    va_end(args);
    // 额外参数处理
    printf("hint: %s\n", hint);
}

int main() 
{
    float f = 6.66;
    VariadicFunction("Here's a hint!", "%a%b%f%a", "string1", &f, 9.99, "STRING2");
    return 0;
}

 

标签:va,函数,hint,fmt,args,C++,char,参数,可变
From: https://www.cnblogs.com/skullboyer/p/17349946.html

相关文章

  • 【介绍】C++五种迭代器
    目录1. 输入迭代器(Input Iterator):2. 输出迭代器(Output Iterator):3. 前向迭代器(Forward Iterator):4. 双向迭代器(Bidirectional Iterator):5. 随机访问迭代器(Random Access Iterator): 1. 输入迭代器(Input Iterator):支持单次读取和前进;即只能遍历一遍集合,并且只能向......
  • PHP中的引用参数的函数
    前言php的引用(就是在变量或者函数、对象等前面加上&符号)在PHP中引用的意思是:不同的名字访问同一个变量内容。与C语言中的指针是有差别的。C语言中的指针里面存储的是变量的内容在内存中存放的地址,函数的引用返回多用在对象中引用参数的函数格式说明如下代码所示:voidfunName(array......
  • recv函数具有包的提前预读
    #include<sys/types.h>#include<sys/socket.h>ssize_trecv(intsockfd,void*buf,size_tlen,intflags);1.具有紧急指针功能2.具有带外数据3.数据包提前预读ssize_trecvfrom(intsockfd,void*buf,size_tlen,intflags,......
  • 第六章 重新组织函数
    6.1提炼函数 一个过长的函数或者一段,需要注释才能理解用途的代码,将这段代码放入一个独立的函数。每个函数的粒度很小,复用的机会就会很大。高层函数可读性就很高,看起来就是再读一堆注释。函数都是细粒度,复写也会更容易。提炼出的函数,根据这个函数的意图来命名(以它做什么命名,......
  • 构造函数私有化或保护化
    构造函数私有化或保护化摘自:https://blog.csdn.net/caoyangxiaoyao/article/details/81184786构造函数私有化/保护化可以将构造函数设置为私有函数,但是这样做就无法从外部直接调用构造函数,因此就无法直接构造这个类的对象。1.如果你不想让外面的用户直接构造一个类(类A)的对象,而是......
  • C++中struct和class的区别 || C++中const和static的作用
    struct和class不同点两者中如果不对成员不指定公私有,struct默认是公有的,class则默认是私有的class默认是private继承,而struct默认是public继承  static不考虑类的情况隐藏。所有不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该......
  • C++ 学习 第八天
    今日内容:匿名函数 动态数组 匿名函数:lambda表达式:捕获列表:[捕获列表]{cout<<endl;}捕获列表捕获的是父作用域下的属性,如果[]为空,默认不补货 值捕获父作用域下所有的属性,只捕获值,不捕获属性本身(只读不写)值捕获父作用域下所有的函数,但是引用捕获父作用域下......
  • 13、c++使用单例模式实现命名空间函数
    本案例实现一个test命名空间,此命名空间内有两个函数,分别为getName()和getNameSpace();声明命名空间及函数namespacetest{conststd::string&getName()和();conststd::string&getNameSpace();}命名空间内实现单例类实现一个单例类,构造函数要为private,自身对......
  • 箭头函数
    箭头函数提供了一种更加简洁的函数书写方式。基本语法是:参数=>函数体箭头函数多用于匿名函数的定义//传统方式定义函数varf1=function(a){returna}//console.log(f1(3))//es6使用箭头函数定义//参数=>函数体varf2=a=>a//console.log(f2(4)) 使......
  • 基于C++研究高并发内存池
    访问【WRITE-BUG数字空间】_[内附完整源码和文档]内存池:程序预先向系统申请一大块足够的内存,此后,当系统需要申请内存的时候,不是直接向操作习题申请,而是向内存池中申请,当释放的时候,不返回给操作系统,而是返回给内存池,当程序退出时,内存池才将申请的内存真正释放高并发内存池借鉴tcmall......