vsnprintf的使用以及c可变参数的传递机制

int vsnprintf (char * s, size_t n, const char * format, va_list arg );

cplusplus.com给出的解释是:Write formatted data from
variable argument list to sized buffer

意思是把格式化的字符串format的最多n位字符写入缓冲区s中,format的参数列表为arg

其返回一个整型数ret,当且仅当ret非负,且ret小于n,表示函数运行成功,把ret个字符写入了缓冲区s

其余情况都视为函数运行失败。

以下是其例子

 1 /* vsnprintf example */
2 #include <stdio.h>
3 #include <stdarg.h>
4
5 void PrintFError ( const char * format, ... )
6 {
7 char buffer[256];
8 va_list args;
9 va_start (args, format);
10 vsnprintf (buffer,256,format, args);
11 perror (buffer);
12 va_end (args);
13 }
14
15 int main ()
16 {
17 FILE * pFile;
18 char szFileName[]="myfile.txt";
19
20 pFile = fopen (szFileName,"r");
21 if (pFile == NULL)
22 PrintFError ("Error opening ‘%s‘",szFileName);
23 else
24 {
25 // file successfully open
26 fclose (pFile);
27 }
28 return 0;
29 }

vsnprintf的示例

在例子中,我们可以看到PrintFError函数用于输出错误信息,其函数声明是这样子的

void PrintFError ( const char * format, ... )
这是一个可变参数的函数,同样,最常用的可变参数函数一定是
int printf ( const char * format, ... );

可变参数可表示为 ...

先来看看以下几个宏,在头文件stdarg.h中

#define _INTSIZEOF(n)  
((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1)

#define va_start(ap,v) ( ap = (va_list)&v +
_INTSIZEOF(v) )          
//第一个可选参数地址
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t))
- _INTSIZEOF(t)) ) //下一个参数地址
#define
va_end(ap)    ( ap = (va_list)0
)                           
// 将指针置为无效

va_list 这是一个用于操作可变参数的类

利用va_start va_arg va_end,可以把所有可变参数取出。

用va_start(ap, v)获取第一个可选参数的地址, 所以v应该是最后一个非可变参数的地址

用va_arg(ap, t)获取下一个va_arg, t是该参数的类型

用va_end(ap) 来使ap变为NULL,结束可变参数操作

以下是代码示例

 1 /* va_start example */
2 #include <stdio.h> /* printf */
3 #include <stdarg.h> /* va_list, va_start, va_arg, va_end */
4
5 void PrintFloats (int n, ...)
6 {
7 int i;
8 double val;
9 printf ("Printing floats:");
10 va_list vl;
11 va_start(vl,n);
12 for (i=0;i<n;i++)
13 {
14 val=va_arg(vl,double);
15 printf (" [%.2f]",val);
16 }
17 va_end(vl);
18 printf ("\n");
19 }
20
21 int main ()
22 {
23 PrintFloats (3,3.14159,2.71828,1.41421);
24 return 0;
25 }

可变参数函数

未完待续

参考网站:

http://blog.csdn.net/edonlii/article/details/8497704

http://www.cppblog.com/qiujian5628/archive/2008/01/21/41562.html

http://www.cplusplus.com/

vsnprintf的使用以及c可变参数的传递机制,布布扣,bubuko.com

时间: 2024-12-20 14:37:17

vsnprintf的使用以及c可变参数的传递机制的相关文章

可变参数函数详解

可变参数函数又称参数个数可变函数(本文也简称变参函数),即函数参数数目可变.原型声明格式为: type VarArgFunc(type FixedArg1, type FixedArg2, -); 其中,参数可分为两部分:数目确定的固定参数和数目可变的可选参数.函数至少需要一个固定参数,其声明与普通函数参数相同:可选参数由于数目不定(0个或以上),声明时用"-"表示("-"用作参数占位符).固定参数和可选参数共同构成可变参数函数的参数列表. 由于参数数目不定,使用可

[c#]params可变参数

摘要 在项目中多多少少会用到params这个关键字,来修饰参数,它的作用,让该参数的个数是可变的,并且可变参数必须是方法的最后一个参数.但如何判断到底有没有为该参数传递值,怎么判断? 一个例子 static void Main(string[] args) { ParamTest(); ParamTest(""); ParamTest("1,2,3,4,5".Split(new char[] { ',', ',' })); string[] strs = "

06_可变参数

static void Main(string[] args) { int[] arr = { 12, 25, 62, 36, 48 }; string name="谭科"; //调用带有params的方法时,params可变参数可以传递一个数组,也可以传递多个同类型数据 //int sum = GetSum(name,12, 26, 36, 45, 69, 63); int sum = GetSum(name, arr); Console.WriteLine("{0}的总成

C语言——可变参数

http://blog.chinaunix.net/space.php?uid=25304914&do=blog&id=3066441 一.是什么 我们学习C语言时最经常使用printf()函数,但我们很少了解其原型.其实printf()的参数就是可变参数,想想看,我们可以利用它打印出各种类型的数据.下面我们来看看它的原型: int printf( const char* format, ...); 它的第一个参数是format,属于固定参数,后面跟的参数的个数和类型都是可变的(用三个点&

可变参数的函数(variadic function)的陷阱

1,介绍variadic function 可变参数的函数就是参数数量可以改变的函数.例如printf(): int printf(const char *format, ...); printf("%d%s\n",i,s); C语言之所以可以支持可变参数函数,一个重要的原因是C调用规范中规定C语言函数调用时,参数是从右向左压入栈的:这样一个函数实现的时候,就无需关心调用他的函数会传递几个参数过来,而只要关心自己用到几个:例子: #include<stdarg.h> voi

C语言可变参数

转自http://www.cnblogs.com/wangyonghui/archive/2010/07/12/1776068.html,稍有改动 一.是什么 我们学习C语言时最经常使用printf()函数,但我们很少了解其原型.其实printf()的参数就是可变参数,想想看,我们可以利用它打印出各种类型的数据.下面我们来看看它的原型: int printf( const char* format, ...); 它的第一个参数是format,属于固定参数,后面跟的参数的个数和类型都是可变的(用三

c#基础学习(0724)之可变参数、ref和out

params可变参数,无论有几个参数,必须出现在参数列表的最后,可以为可变参数直接传递一个对应类型的数组 #region 可变参数 //1.如果方法有多个参数,可变参数可以作为最后一个参数 //2.可变参数可以传递参数也可以不传递参数,如果不传递参数,则args数组为一个长度为0的数组 //3.可变参数可以直接传递一个数组进来 static void Test(string msg,params int[] args) { //如果可变参数传值为null时,需要加上判断 if(args!=nul

Python3注解+可变参数实现

一.说明 1.1 关于注解 关于注解这个东西,最早是在大学学java的时候经常会看到某些方法上边@override之类的东西,一方面不知道其作用但另一方面似乎去掉也没什么影响,所以一直都不怎么在意. 今年去看开发的代码也看到很多注解,问其用途基本都和网上类似“为了开启XXX功能我们需要添加@XXX注解的”/”添加@XXX注解是为了开启XXX功能“,不知其原理感觉颇为难受所以自己来研究了一翻. 1.2 关于可变参数 所谓可变参数,最主要就是指传递给被调用函数的参数的个数是不定的. 可变参数应该来说

参数的传递

我们都应该知道所谓的编程语言就是通过一系列的函数变换,实现数据的传输,变换,最终呈现出我们所需要的效果.可以说无论是什么编程语言数据的传递都是弥足珍贵的.可是我们在传输数据的过程中不能仅仅是简单的传输,我们需要一种载体来承接我们传输的内容,也就是我要说的参数. 参数有形参和实参之分,所谓的实参可以理解为实际参数,就是我们通过函数想要传递的内容,而形参呢?简单的说就是形式参数,就是一个桥梁,用它去接收我们传递过来的内容,并存入到储存单元中,然后释放形参.那么实参和形参是怎样传递的呢?在他们的传递过