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#开发软件的公司和程序员都很少?
    使用Redis之前5个必须了解的事情
    这段代码为什么捕获不到异常呢?谁能给个解释,谢谢。
    git报错
    C# 常用类库(字符串处理,汉字首字母拼音,注入攻击,缓存操作,Cookies操作,AES加密等)
    你所不知道的 CSS 负值技巧与细节
    CSS 属性选择器的深入挖掘
    探秘 flex 上下文中神奇的自动 margin
    CSS 火焰?不在话下
    不可思议的纯 CSS 实现鼠标跟随效果
  • 原文地址:https://www.cnblogs.com/jiu0821/p/8810095.html
Copyright © 2011-2022 走看看