使用<stdarg.h>实现可变参数,av_list的使用
在日常写函数的时候有时候需要用到可变参数,然后学习了一下可变参数的使用。
先介绍三个函数与一个变量类型:使用这个库的前提是需要使用stdio.h 与stdarg.h
av_list类型:是一个char * 类型的字符串指针,
它用来指向我们参数的地址。
接下来我们介绍需要使用的三个函数。原型在下图中展示。
av_start(ap, x):是一个宏函数,ap应该就是args pointer 参数指针,x是第一个参数
执行start之后ap会自动偏移到第二个参数的地址。
av_arg(ap, t):t为参数类型,如果t是char 那么它会返回一个字符,如果是cahr*会返回字符串首地址,我们可以根据这个t来遍历,我们输入的format,对不同类型的数据进行处理,其实也可以用输入输出流格式化提取数据或者用正则表达式,但是遇到了就玩玩。
av_end(ap):将ap置为空,参数指针置为空。
下面随便写个例子玩玩。
#include <stdio.h>
#include <stdarg.h>
void myFormat(const char *fmt, ...)
{va_list arglist;//参数指针va_start(arglist, fmt);//指向第二个参数while(*fmt != '\0'){if(*fmt == '%')//格式化输出的符号{switch(*(++fmt)){case 'd': printf("%d",(va_arg(arglist, int))); break;case 'c': break;case 's': printf("%s",(va_arg(arglist,char *))); break;case 'x': break;default: printf("default");}}else {printf("%c",*fmt);}fmt++;}va_end(arglist);
}
int main(int agc,char * agv[])
{myFormat("%s%d\n","VA_ARG",888);return 0;
}
运行结果。
在单片机里面用的比较多吧。应用开发不怎么用。
使用<stdarg.h>实现可变参数,av_list的使用相关推荐
- C语言———不定参数标准库 stdarg.h
前言: 在很多工程代码中,工程师考虑到后续软件设计的兼容性和扩展性,在接口函数中时常会使用一些可变参数.一开始全部考虑到这些很难,因为统筹全局需要经验和思考来支撑.C语言标准库<stdarg.h ...
- 【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- getMethod方法getMethod(String name, Class<?>... parameterTypes)传入可变参数类型
反射的getMethod方法getMethod(String name, Class<?>- parameterTypes) Class<?>- parameterTypes ...
- C++:函数参数不确定时用cstdarg(stdarg.h)
◎用法: func( Type para1, Type para2, Type para3, ... ) { /****** Step 1 ******/ va_list ap ...
- C/C++语言函数参数里的“...”作用,va_list的使用(stdarg.h)
以Linux "man 手册"里的printf函数声明为例,谈谈我对C语言函数的可变参数的一点理解. printf的函数声明如下:int printf(const char *fo ...
- C 语言的可变参数类型 stdarg
va_list/va_start/va_arg/va_end这几个宏,都是用于函数的可变参数的. 我们来看看在vs2008中,它们是怎么定义的: 1: ///stdarg.h2: #define va ...
- 探究C/C++可变参数
C/C++支持可变参数个数的函数定义,这一点与C/C++语言函数参数调用时入栈顺序有关, 首先引用其他网友的一段文字,来描述函数调用,及参数入栈: ------------ 引用开始 -------- ...
- 省略号和可变参数模板
1.基本概念 省略号在C/C++中有很多用途,包括函数的变量参数列表.C运行库的printf()就是常见示例. 可变参数模板提供了类型安全和灵活性,可应用于类模板和函数模板. 2.语法示例 templ ...
- 理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
参考: http://www.360doc.com/content/12/0309/10/4025635_192940551.shtml http://www.cnblogs.com/Annie ...
最新文章
- mysql根据时间取前后几秒,几分钟,几小时,几天,几月,几年
- 反编译工具jad简单用法
- JAVA 基本运算符(摘)
- iOS一些推荐的学习路径发展
- LeetCode 938. 二叉搜索树的范围和(二叉树遍历+搜索剪枝)
- 系统架构设计师 - 23种设计模式(GOF)
- python查找文件名_Python实现的根据文件名查找数据文件功能示例
- 数据可视化如何做会更好
- 使用dumpbin查看dll有哪些函数
- 第15周学习进度情况
- 4.23上海交大PMP试题每日一题
- 快速获取知网,万方,维普等永久性免费下载权限
- unity学习笔记(二)—— 制作第一个小游戏
- 分享5个制定市场营销神器
- 同盾科技声纹识别建模大赛
- jQuery手机触屏拖动滑块验证跳转插件
- PMOS和NMOS引脚及封装
- 07 list和dict for循环遍历索引问题以及深浅拷贝
- 冒泡排序MATLAB实现
- csdn博客误删恢复办法
热门文章
- 华为hicar支持车型列表_【企业】华为智选车载智慧屏将12月上市:有望搭载鸿蒙系统...
- 2022-2028全球硅胶疤痕凝胶产品行业调研及趋势分析报告
- 淘宝联盟API申请使用教程
- Python随机数判断
- 博弈论学习笔记(十)混合策略
- 语音识别技术:如何开启语音交互的新时代?
- Java 中 Executors.newSingleThreadExecutor() 与Executors.newFixedThreadPool(1)有什么区别
- 2021年中国医药行业发展现状及重点企业对比分析[图]
- 分享五个好用的自定义域名链接缩短平台,2023年测试可用
- 新手要怎么管理好公司档案?