首页 > 其他 > 详细

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

时间:2014-05-15 16:15:46      阅读:522      评论:0      收藏:0      [点我收藏+]
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
其余情况都视为函数运行失败。
以下是其例子
bubuko.com,布布扣
 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,结束可变参数操作

以下是代码示例

bubuko.com,布布扣
 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

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

原文:http://www.cnblogs.com/elenno/p/va.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!