码迷,mamicode.com
首页 > 其他好文 > 详细

vprintf 和 vsnpintf 的用法

时间:2018-04-12 20:46:58      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:list   return   ring   用法   float   ...   第一个   vsp   erro   

函数定义:


int vprintf ( const char * format, va_list arg );

 

printf() and friends are for normal use. vprintf() and friends are for when you want to write your own printf()-like function. Say you want to write a function to print errors:

标准库函数vprintf函数与printf函数类似,所不同的是,它用一个参数取代了变长参数表,且此参数通过调用va_start宏进行初始化。同样,vfprintf和vsprintf函数分别与fprintf和sprintf函数类似。


程序例:
#include   <stdio.h>        
#include   <stdarg.h>        
int vpf(char *fmt, ...)
{
  va_list argptr;
  int cnt;
  va_start(argptr, fmt);
  cnt = vprintf(fmt, argptr);
  va_end(argptr);
  return(cnt);
}
int main(void)
{
  int inumber = 30;
  float fnumber = 90.0;
  char *string = "abc";
  vpf("%d %f %s\n",inumber,fnumber,string);
  return 0;
}
 

va_list原理解释:

VA_LIST 是在C语言中解决变参问题的一组宏,在<stdarg.h>头文件下。

VA_LIST的用法:     
      (1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针
      (2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数。
      (3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型。
      (4)最后用VA_END宏结束可变参数的获取。然后你就可以在函数里使用第二个参数了。如果函数有多个可变参数的,依次调用VA_ARG获取各个参数。

 

下面是vsnprintf 的一个例子:

va_list ap; //声明一个变量来转换参数列表  
va_start(ap,fmt);          //初始化变量  
va_end(ap);     //结束变量列表,和va_start成对使用  
可以根据va_arg(ap,type)取出参数 

 

已经经过调试成功的输出程序

#include<stdio.h>
#include <stdarg.h>

#define bufsize 80
char buffer[bufsize];

int vspf(char *fmt, ...)
{
  va_list argptr;
  int cnt;
  va_start(argptr, fmt);

  cnt = vsnprintf(buffer,bufsize ,fmt, argptr);

  va_end(argptr);

  return(cnt);
}

int main(void)
{
  int inumber = 30;

  float fnumber = 90.0;

  char string[4] = "abc";

  vspf("%d %f %s", inumber, fnumber, string);

  printf("%s\n", buffer);

 

return 0;
}

vprintf 和 vsnpintf 的用法

标签:list   return   ring   用法   float   ...   第一个   vsp   erro   

原文地址:https://www.cnblogs.com/jiu0821/p/8810095.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!