可变参数函数

  • 一、函数介绍
  • 二、使用步骤
    • 例程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可变参函数基本解释及使用相关推荐

  1. sprintf函数详细解释

    printf 可能是许多程序员在开始学习C 语言时接触到的第二个函数(我猜第一个是main),说 起来,自然是老朋友了,可是,你对这个老朋友了解多吗?你对它的那个孪生兄弟sprintf 了解多 吗?在 ...

  2. C语言学习——sprintf函数详细解释及其用法

    函数功能: 把格式化的数据写入某个字符串 头文件: stdio.h 函数原型: int sprintf( char *buffer, const char *format, [ argument] - ...

  3. 【printf】sprintf字符串转数值、数值转字符,拼接字符,函数详细解释 Printf 打印数值...

    1.数值转成字符: sprintf个函数,如: sprintf(s, "%d", 123); //产生"123" 2.字符串转成数值: while(*BandR ...

  4. 详细解释sprintf 函数(转)

    sprintf 函数详细解释(转)   sprintf() 格式化输出函数 功能: 函数sprintf()用来作格式化的输出. 用法: 此函数调用方式为int sprintf(char *string ...

  5. TCP三次握手和四次挥手的解释

    基础知识 在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 其中,对于我们日常的分析有用的就是前面的五个字段. 它们的含义是: SYN ...

  6. java 解释型和编译型

    编译型语言和解释型语言 编译型语言: 举一个恰当的例子来理解,一本汉语的书,需要翻译成英文的书来帮助外国人理解,一种就是把正本书翻译完,然后给到外国人来阅读,这种方式就相当于编程中的编译型. 解释型: ...

  7. [翻译]Python中yield的解释

    问题: Python中yield关键字的作用是什么?它做了什么? 例如,我想理解以下代码 def node._get_child_candidates(self, distance, min_dist ...

  8. (康托展开解释)+ NYOJ 139 我排第几个

    描述 现在有"abcdefghijkl"12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的? 输入 第一行有一个整数n(0<n& ...

  9. 具体解释可变參数列表

    可变參数   至少有一个參数 比如:void add(int a,- ){} 例题  模拟printf()函数 #include <stdio.h> #include <stdarg ...

最新文章

  1. TaintDroid深入剖析之启动篇
  2. 并发 线程交替执行_并发与并行的区别
  3. LeetCode 96不同的二叉搜索树95不同的二叉搜索树Ⅱ
  4. 邮件头解析=?utf-8?Q?乱码
  5. 《迷宫》之站立会议—5.15
  6. Android异常总结---ActivityManager: Warning: Activity not started, its current task has been brought to
  7. 解决datafountain比赛提交.csv文件报错问题
  8. printf 小代码 大问题
  9. 使用labelme进行图片语义分割数据的标注(如何转换为训练的灰度图,即像素值为类别值)
  10. 64位win10下安装xgboost python包的教程
  11. javaSE基础之字符串
  12. 【HDU6051】if the starlight never fade
  13. pwrkey直接接地 sim7020_有方模块常见问题解答
  14. emwin emf格式视频生成环境搭建
  15. null 和 undefined 的区别
  16. 若依对接企业微信JS-DK
  17. qq邮箱html源码,qq邮箱源码
  18. alertdialog旋转屏幕消失造成leak window
  19. VC++游戏编程----游戏画面特效制作1
  20. DVD-ROM区域码巧破解[转]

热门文章

  1. mongodb nginx代理问题
  2. Windows 11 跳过启动显示配置偏好设置页面
  3. MySQL日志类型详解(全)
  4. 好看的动漫html页面,漂亮的页面过渡动画
  5. 1027-特色酒店后台管理系统servlet
  6. Rootkit---HOOK内核驱动
  7. 华为在发布会带来了harmonyos,华为HarmonyOS 2.0正式发布,共赢移动终端产业的下一个十年...
  8. 家庭路由器出现的问题和解决的办法
  9. iphone 恒屏和自动旋转
  10. 分享,企业短视频矩阵账号的定位方法