va_strartva_endva_argvsprintf可变参函数基本解释及使用
可变参数函数
- 一、函数介绍
- 二、使用步骤
- 例程1:测试vsprintf
- 例程2:测试va_arg
一、函数介绍
/******************头文件*********************/
#include <stdarg.h>
/****************变参列表指针类型****************/
va_list //指向变参列表的参数类型,实际是一个字符指针
/**************************************************
* 函数名称: va_start
* 函数入口:
* va_list ap:可变参数列表指针
* last:可变参数前一个参数即:“...”前面的参数
* 函数出口:无
* 函数说明:用于将参数ap指向变参数列表第一个参数
* *************************************************/
void va_start(va_list ap, last);
/**************************************************
* 函数名称: va_arg
* 函数入口:
* va_list ap:可变参数列表指针
* type:获取参数的类型
* 函数出口:
* type:获取参数数据
* 函数说明: 用于按照指定类型获取ap指向变参列表中的参数值,获取成功后将偏移参数列表中下一个位置
* *************************************************/
type va_arg(va_list ap, type);
/**************************************************
* 函数名称: va_end
* 函数入口:
* va_list ap:可变参数列表指针
* 函数出口: 无
* 函数说明:与va_start配套用于释放释放指针,将输入的参数 ap 置为 NULL。
* *************************************************/
void va_end(va_list ap);
/**************************************************
* 函数名称: va_copy
* 函数入口:
* va_list src:源变参指针列表
* 函数出口: va_list dest:目标参数列表指针
* 函数说明:用于将一个变参列表复制到另一变参列表指针。
* *************************************************/
void va_copy(va_list dest, va_list src);
/**************************************************
* 函数名称: vsprintf
* 函数入口:
* str:保存格式化信息
* format:格式化字符串
* ap:可变参数列表变量,指明需要格式的数据
* 函数出口: 无
* 函数说明: 返回已经格式化的字符数,出现错误返回EOF。
* 此函数头文件为:#include <stdio.h>
* *************************************************/
int vsprintf(char *str, const char *format, va_list ap);
二、使用步骤
说明:
读取可变参数的过程其实就是在栈区中,使用指针,遍历栈区中的参数列表,从低地址到高地址一个一个地把参数内容读出来的过程,栈区地址是从高到低分配的,由于压栈特性,因此取数据先从栈顶向栈底取(从低地址向高地址)。因此对于处理变参问题上,引入了一个变参列表指针ap,用于指向变参列表首地址。
例程1:测试vsprintf
#include <stdio.h>
#include <stdarg.h>
int user_printf(char *format,...)
{va_list ap;char vsbuf[1024]={0};va_start(ap,format);//第二个参数就是"..."前面的参数formatint len=vsprintf(vsbuf,format,ap);//将变参数内容进行格式化转换printf("%s",vsbuf);//假设替换为单片机下的发送接口使用可以实现格式化发送va_end(ap);//释放指针return len;
}void main(void){int a[3]={1,2,3};printf("%d\r\n", user_printf("1234[%d][%d][%d]\r\n",a[0],a[1],a[2]));}
运行结果:
1234[1][2][3]
15
例程2:测试va_arg
#include <stdio.h>
#include <stdarg.h>
int user_strtets(char *msg,...)
{va_list ap;va_start(ap,msg);//第二个参数就是"..."前面的参数formatprintf("%s\r\n",va_arg(ap,char *));//获取“...”中第一参数“222”printf("%s\r\n",va_arg(ap,char *));//获取“...”中第二参数“333”va_end(ap);//释放指针
}void main(void){int a[3]={1,2,3};user_strtets("111","222","333");}
运行结果:
222
333
va_strartva_endva_argvsprintf可变参函数基本解释及使用相关推荐
- sprintf函数详细解释
printf 可能是许多程序员在开始学习C 语言时接触到的第二个函数(我猜第一个是main),说 起来,自然是老朋友了,可是,你对这个老朋友了解多吗?你对它的那个孪生兄弟sprintf 了解多 吗?在 ...
- C语言学习——sprintf函数详细解释及其用法
函数功能: 把格式化的数据写入某个字符串 头文件: stdio.h 函数原型: int sprintf( char *buffer, const char *format, [ argument] - ...
- 【printf】sprintf字符串转数值、数值转字符,拼接字符,函数详细解释 Printf 打印数值...
1.数值转成字符: sprintf个函数,如: sprintf(s, "%d", 123); //产生"123" 2.字符串转成数值: while(*BandR ...
- 详细解释sprintf 函数(转)
sprintf 函数详细解释(转) sprintf() 格式化输出函数 功能: 函数sprintf()用来作格式化的输出. 用法: 此函数调用方式为int sprintf(char *string ...
- TCP三次握手和四次挥手的解释
基础知识 在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 其中,对于我们日常的分析有用的就是前面的五个字段. 它们的含义是: SYN ...
- java 解释型和编译型
编译型语言和解释型语言 编译型语言: 举一个恰当的例子来理解,一本汉语的书,需要翻译成英文的书来帮助外国人理解,一种就是把正本书翻译完,然后给到外国人来阅读,这种方式就相当于编程中的编译型. 解释型: ...
- [翻译]Python中yield的解释
问题: Python中yield关键字的作用是什么?它做了什么? 例如,我想理解以下代码 def node._get_child_candidates(self, distance, min_dist ...
- (康托展开解释)+ NYOJ 139 我排第几个
描述 现在有"abcdefghijkl"12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的? 输入 第一行有一个整数n(0<n& ...
- 具体解释可变參数列表
可变參数 至少有一个參数 比如:void add(int a,- ){} 例题 模拟printf()函数 #include <stdio.h> #include <stdarg ...
最新文章
- TaintDroid深入剖析之启动篇
- 并发 线程交替执行_并发与并行的区别
- LeetCode 96不同的二叉搜索树95不同的二叉搜索树Ⅱ
- 邮件头解析=?utf-8?Q?乱码
- 《迷宫》之站立会议—5.15
- Android异常总结---ActivityManager: Warning: Activity not started, its current task has been brought to
- 解决datafountain比赛提交.csv文件报错问题
- printf 小代码 大问题
- 使用labelme进行图片语义分割数据的标注(如何转换为训练的灰度图,即像素值为类别值)
- 64位win10下安装xgboost python包的教程
- javaSE基础之字符串
- 【HDU6051】if the starlight never fade
- pwrkey直接接地 sim7020_有方模块常见问题解答
- emwin emf格式视频生成环境搭建
- null 和 undefined 的区别
- 若依对接企业微信JS-DK
- qq邮箱html源码,qq邮箱源码
- alertdialog旋转屏幕消失造成leak window
- VC++游戏编程----游戏画面特效制作1
- DVD-ROM区域码巧破解[转]