vprintf 和 vsnpintf 的用法

函数定义:


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;
}

posted @ 2018-04-12 19:59  jiu~  阅读(680)  评论(0编辑  收藏  举报