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

  • 相关阅读:
    一句话解释c#中的特性,你了解多少
    CentOS虚拟机如何设置共享文件夹,并在Windows下映射网络驱动器?
    samba服务器配置及window网络磁盘映射
    PHP中各种Hash算法性能比较
    Redis持久化
    设置redis主从出现的问题
    Redis启动多端口、运行多实例
    Redis学习手册(主从复制)
    tengine/nginx-tomcat动静分离遇到的问题
    使用 Git Hooks 实现自动项目部署
  • 原文地址:https://www.cnblogs.com/jiu0821/p/8810095.html
Copyright © 2011-2022 走看看