vsnprintf va_list va_start va_end
1、函数原型:
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
某度百科:
_vsnprintf是C语言库函数之一,属于可变参数。用于向字符串中打印数据、数据格式用户自定义。
头文件是#include <stdarg.h>。
函数功能:将可变参数格式化输出到一个字符数组。
2、参数说明
char *str [out],把生成的格式化的字符串存放在这里.指向存储结果C字符串的缓冲区的指针。
缓冲区应至少有n个字符的大小。size_t size [in], str可接受的最大字符数 (非字节数,UNICODE一个字符两个字节),防止产生数组越界.生成的字符串的长度至多为n-1,为额外的终止空字符留下空间。size_t是一个无符号整数类型。
const char *format [in], 指定输出格式的字符串,它决定了你需要提供的可变参数的类型、个数和顺序。包含格式字符串的C字符串,其格式字符串与printf中的格式相同
va_list ap [in], va_list变量. va:variable-argument:可变参数,标识使用va_start初始化的变量参数列表的值。
va_list是在<cstdarg>中定义的特殊类型。返回值:
如果n足够大,则会写入的字符数,不包括终止空字符。
如果发生编码错误,则返回负数。
注意,只有当这个返回值是非负值且小于n时,字符串才被完全写入。
3、vsnprintf和_vsnprintf(一个多了横杠)一样吗
vsnprintf和_vsnprintf用法应该差不多,是不是一样的,我也还没有结论,
但某度百科,有备注:
linux环境下是:vsnprintf
VC6环境下是:_vsnprintf
是不是一样这里我也不给出结论,下面只讲linux下的vsnprintf
4、查看资料
在linux下可以自己使用命令行查看使用方法
在linux下使用man vsnprintf回车可以看到右上角有个PRINTF(3),3可以知道这是个库函数(不是系统调用或者其他的,详细见附文,man的参数说明),并且可以知道vsnprintf的使用方法,摘抄如下:
SYNOPSIS#include <stdio.h>int printf(const char *format, ...);int fprintf(FILE *stream, const char *format, ...);int sprintf(char *str, const char *format, ...);int snprintf(char *str, size_t size, const char *format, ...);#include <stdarg.h>int vprintf(const char *format, va_list ap);int vfprintf(FILE *stream, const char *format, va_list ap);int vsprintf(char *str, const char *format, va_list ap);int vsnprintf(char *str, size_t size, const char *format, va_list ap);//翻到最底下还有例程#include <stdio.h>#include <stdlib.h>#include <stdarg.h>char * make_message(const char *fmt, ...){int n;int size = 100; /* Guess we need no more than 100 bytes */char *p, *np;va_list ap;if ((p = malloc(size)) == NULL)return NULL;while (1) {/* Try to print in the allocated space */va_start(ap, fmt);n = vsnprintf(p, size, fmt, ap);va_end(ap);/* Check error code */if (n < 0)return NULL;/* If that worked, return the string */if (n < size)return p;/* Else try again with more space */size = n + 1; /* Precisely what is needed */if ((np = realloc (p, size)) == NULL) {free(p);return NULL;} else {p = np;}}}
4、网上查看其他资料
到网上其他博客查资料,可以知道vsnprintf一般用于可变参数的解析中,将可变参数格式化输出到一个字符数组。
通常和va_list 、va_start 、va_end 这几个联合使用。
man va_start可查到
#include <stdarg.h>void va_start(va_list ap, last);type va_arg(va_list ap, type);void va_end(va_list ap);void va_copy(va_list dest, va_list src);
va_list是一个宏,由va_start和va_end界定。
typedef char* va_list;
void va_start ( va_list ap, prev_param );
type va_arg ( va_list ap, type );
void va_end ( va_list ap );
其中,va_list 是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行。
<Step 1> 在调用参数表之前,应该定义一个 va_list 类型的变量,以供后用(假设这个 va_list 类型变量被定义为ap);
<Step 2> 然后对 ap 进行初始化,让它指向可变参数表里面的第一个参数。这是通过 va_start 来实现的,其第一个参数是 ap 本身,第二个参数last是变量前面最后一个参数的名称参数列表,即调用函数已知其类型的最后一个参数。因为此参数的地址可能会在va_start()中使用宏,则不应将其声明为寄存器变量或函数操作或数组类型。va_start()宏将初始化ap以供va_arg()和va_end()后续使用,并且必须首先调用。
<Step 3> 然后是获取参数,调用 va_arg。调用va_arg的例子见下面它的第一个参数是 ap,第二个参数是要获取的参数的指定类型,并返回这个指定类型的值,同时把 ap 的位置指向变参表的下一个变量位置;或者调用vsnprintf见上面。
<Step 4> 获取所有的参数之后,我们有必要将这个 ap 指针关掉,以免发生危险,方法是调用 va_end。它是将输入的参数 ap 置为 NULL,应该养成获取完参数表之后关闭指针的习惯。
int max(int n, ...) // 定参 n 表示后面变参数量,定界用,输入时切勿搞错
{ va_list ap; // 定义一个 va_list 指针来访问参数表va_start(ap, n); // 初始化 ap,让它指向第一个变参int maximum = -0x7FFFFFFF; // 这是一个最小的整数int temp;for(int i = 0; i < n; i++){temp = va_arg(ap, int); // 获取一个 int 型参数,并且 ap 指向下一个参数if (maximum < temp)maximum = temp;}va_end(ap); // 善后工作,关闭 apreturn maximum;
}// 在主函数中测试 max 函数的行为(C++ 格式,vc6.0)
int main()
{cout << max(3, 10, 20, 30) << endl;cout << max(6, 20, 40, 10, 50, 30, 40) << endl;
}
附:
linux可以通过man来查询一些函数的使用方法(巧记:小学老师教学生遇到问题找警察,linux下遇到问题还是需要找男人(man),哈哈哈)
man查看对应的一些数字代表的意义。
1、Standard commands (标准命令)
2、System calls (系统调用)
3、Library functions (库函数)
4、Special devices (设备说明)
5、File formats (文件格式)
6、Games and toys (游戏和娱乐)
7、Miscellaneous (杂项)
8、Administrative Commands (管理员命令)
9 其他(Linux特定的), 用来存放内核例行程序的文档
本文参考自以下互联网文章,如果有侵权请及时联系删除。
https://blog.csdn.net/swif_N_F/article/details/78712315
https://baike.baidu.com/item/_vsnprintf/5395011?fr=aladdin
https://blog.csdn.net/taotaost/article/details/52894192
http://blog.sina.com.cn/s/blog_590be5290100qhxr.html
vsnprintf va_list va_start va_end相关推荐
- va_list/va_start/va_end的使用
va_list 键入以保存有关变量参数的信息 va_start 初始化变量参数列表 初始化ap以检索参数paramN后面的附加参数. 调用va_start的函数在返回之前也应调用va_end. 参数不 ...
- va_list va_start va_end的使用
<pre name="code" class="cpp" style="color: rgb(51, 51, 51); white-space: ...
- 对va_list; va_start ; va_end ;vsprintf理解(转)
以下为转载内容: 1 int printf(const char* fmt, ...) 2 { 3 va_list args; 4 int i; 5 //1.将变参转化为字符串 6 va_start( ...
- 变长参数va_list va_start va_arg va_end
对于int printf(const char *format, ...);这种变长参数,需要使用va_list va_start va_end va_arg来访问参数. 下面是一个tutorials ...
- va_list/va_start/va_arg/va_end深入分析
va_list/va_start/va_arg/va_end这几个宏,都是用于函数的可变参数的. 我们来看看在vs2008中,它们是怎么定义的: 1: ///stdarg.h 2: #define v ...
- 可变参数列表(va_list,va_arg,va_copy,va_start,va_end)
本文转自:http://blog.csdn.net/costa100/article/details/5787068 va_list arg_ptr:定义一个指向个数可变的参数列表指针: va_sta ...
- C语言 va_start / va_end / va_arg 自定义 printf 函数 - C语言零基础入门教程
目录 一.前言 二.函数不定长参数简介 1.va_start 2.va_arg 3.va_end 三.win32 控制台版本 四.MFC 对话框版本 五.猜你喜欢 零基础 C/C++ 学习路线推荐 : ...
- 可变参数:va_list(),va_start(),va_arg(),va_end() 详细解析
目录 1.含义: 2.使用: 3.连续打印出自定义格式的文字: 1.含义: (1)va_list是C语言中的一个宏定义,用于表示一个变长参数列表.它是一个指向变长参数列表的指针,可以通过宏va_sta ...
- C语言使用函数参数传递中的省略号:va_list, va_start, va_arg, va_end
首先要处理这种省略号的参数的话,需要包含头文件#include <stdarg.h>,然后利用下面的函数对"..."省略号变量进行处理. va_list arg; ty ...
最新文章
- Echart在Openlayers的应用
- Vivado 自定义VHDL的IP核
- 第6篇:Flowable快速工作流脚手架Jsite_请假实战_部门经理审批
- javaweb实训第三天下午——Web基础-Servlet交互JSP原理及运用
- PHP技术的优缺点(转载)
- 搞清clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop
- 高德地图聚合自定义样式
- CSP内容安全策略基础版
- 服务器vmx 文件,ISO,虚拟机,VMware,VMX文件和VMDK文件之间的关系
- Python语言程序设计(嵩天老师)-期末考核2.1-快乐数字
- 英语3500词(二) your dream lover主题 (2022.1.14)
- 毕业设计-基于微信小程序的“助农”销售系统
- Microsoft XBOX 360 Project Natal 体感装置2010年6月15正式发布产品正式命名为“Kinect”...
- 华为防火墙VRRP双机热备的配置
- 单商户商城系统功能拆解39—分销应用—分销等级
- WebLogic启动服务卡住报错 :Server started in RUNNING mode
- java--顺序、选择、循环结构
- 什么是大数据(Big Data)?
- IOS仿[自选股]项目开发
- ps简单合成一个微小人像
热门文章
- [Cron]Cron的语法规则及常用的例子
- 一点学计算机后的感受,计算机心得体会
- 应用usb_cam同时打开多个摄像头方法
- ntpd自动启动java_ntpd 使用NTPD设置时间服务器
- 分分钟搞定Grafana(图文详解)
- 凸多边形最优三角剖分
- Sql Server 2008 数据库实时同步
- 余额宝弱爆了,首支可ATM取现货币基金面世
- 图像质量评估(5) -- 畸变(Distortion)
- 方舟服务器设置文档,方舟生存进化参数文件ini怎么设置_方舟生存进化参数文件ini设置教程_玩游戏网...