zoukankan      html  css  js  c++  java
  • vsprintf 变参函数可以用

    vsprintf

     
      /* 函数名: vsprintf
     
      功 能: 送格式化输出到串中
     
      返回值: 正常情况下返回生成字串的长度(除去\0),错误情况返回负值
     
      用 法: int vsprintf(char *string, char *format, va_list param);
     
      // 将param 按格式format写入字符串string中
     
      注: 该函数会出现内存溢出情况,建议使用vsnprintf
     
      程序例:
     
      */
     
      #include <stdarg.h>
     
      char buffer[80];
     
      int vspf(char *fmt, ...)
     
      {
     
      va_list argptr;
     
      int cnt;
     
      va_start(argptr, fmt);
     
      cnt = vsprintf(buffer, 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;
     
      }
     
      该程序结果为
     
      30 90.000000 abc
     
      VA_LIST的用法( VA_LIST 是在C语言中解决变参问题的一组宏):
     
      (1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针
     
      (2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,这个宏的第二个
     
      参数是第一个可变参数的前一个参数,是一个固定的参数。(如在运行VA_START
     
      (ap,v)以后,ap指向第一个可变参数在堆栈的地址。)
     
      (3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型。
     
      (4)最后用VA_END宏结束可变参数的获取。然后你就可以在函数里使用第二个参数了。
     
      如果函数有多个可变参数的,依次调用VA_ARG获取各个参数。
     
    vsnprintf
     
    头文件:
     
      #include <stdarg.h>
     
      函数声明:
     
      int _vsnprintf(char *buffer, size_t max_count, const char *format, va_list vArgList);
     
      参数说明:
     
      1. char *buffer [out],把生成的格式化的字符串存放在这里.
     
      2. size_t max_count [in], buffer可接受的最大字节数,防止产生数组越界.
     
      3. const char *format [in], 格式化字符串
     
      4. va_list vArgList [in], va_list变量. va:variable-argument:可变参数
     
      用法类似于vsprintf,只不过加了max_count的限制.
     
      返回值说明:
     
      如果成功调用此函数,返回写到buffer中的字符的个数(不包括结尾的'\0')。snprintf和vsnprintf函数不能够写多于size大小(包括结尾的'0')的字节数。如果输出因为以上原因被截断,返回成功写入buffer的字符数(不包括结尾的'\0'),如果有足够的内存空间的话。所以,如果返回值等于size或者大于size,表示输出到buffer的字符被截断,如果输出过程中遇到错误,则返回一个负数。
     
    int mon_log(char* format, ...)
     
      {
     
      va_list vArgList; //定义一个va_list型的变量,这个变量是指向参数的指针.
     
      va_start(vArgList, format); //用va_start初始化变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数.
     
      _vsnprintf(str_tmp, 3, format, vArgList); //注意,不要漏掉前面的_
     
      va_end(vArgList); //用va_end结束可变参数的获取
     
      return 0;
     
      }
     
      //调用上面的函数
     
      mon_log("%d,%d,%d,%d", 1,2,3,4);
     
      返回值用法:
     
      #include <stdio.h>
     
      #include <stdlib.h>
     
      #include <stdarg.h>
     
      char *
     
      make_message(const char *fmt, ...) {
     
      /* 初始时假设我们只需要不超过100字节大小的空间 */
     
      int n, size = 100;
     
      char *p;
     
      va_list ap;
     
      if ((p = (char *)malloc(size)) == NULL)
     
      return NULL;
     
      while (1) {
     
      /* 尝试在申请的空间中进行打印操作 */
     
      va_start(ap, fmt);
     
      n = vsnprintf (p, size, fmt, ap);
     
      va_end(ap);
     
      /* 如果vsnprintf调用成功,返回该字符串 */
     
      if (n > -1 && n < size)
     
      return p;
     
      /* vsnprintf调用失败(n<0)或者p的空间不足够容纳size大小的字符串(n>=size),尝试申请更大的空间*/
     
      size *= 2; /* 两倍原来大小的空间 */
     
      if ((p = (char *)realloc(p, size)) == NULL)
     
      return NULL;
     
      }
     
      }
     
      int main() {
     
      /* 调用上面的函数 */
     
      char* str = make_message("%d,%d,%d,%d",5,6,7,8);
     
      printf("%s\n",str);
     
      return 0;
     
      }
  • 相关阅读:
    编写高质量代码改善C#程序的157个建议——建议34:为泛型参数设定约束
    编写高质量代码改善C#程序的157个建议——建议33:避免在泛型类型中声明静态成员
    编写高质量代码改善C#程序的157个建议——建议32:总是优先考虑泛型
    编写高质量代码改善C#程序的157个建议——建议31:在LINQ查询中避免不必要的迭代
    编写高质量代码改善C#程序的157个建议——建议30:使用LINQ取代集合中的比较器和迭代器
    编写高质量代码改善C#程序的157个建议——建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>
    编写高质量代码改善C#程序的157个建议——建议28:理解延迟求值和主动求值之间的区别
    编写高质量代码改善C#程序的157个建议——建议27:在查询中使用Lambda表达式
    编写高质量代码改善C#程序的157个建议——建议26:使用匿名类型存储LINQ查询结果
    编写高质量代码改善C#程序的157个建议——建议25:谨慎集合属性的可写操作
  • 原文地址:https://www.cnblogs.com/guotao/p/2610176.html
Copyright © 2011-2022 走看看