zoukankan      html  css  js  c++  java
  • 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 ",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 ", buffer);

     

    return 0;
    }

  • 相关阅读:
    Macbook键盘的使用基础技巧
    JSTL详解
    为了理想,因为爱情-开课第一天有感(鸡汤向)
    HK游记 Day2迪斯尼(下)
    MP20 MBO issue summary
    音频测量加权
    有没有降噪
    信源编码信源译码和信道编码和译码和加密和解密数字调制和解调和同步
    gcc
    数据挖掘|统计的艺术
  • 原文地址:https://www.cnblogs.com/jiu0821/p/8810095.html
Copyright © 2011-2022 走看看