vsprintf与 vsnprintf

    技术2022-05-12  11

    vsprintf

      /* 函数名: vsprintf   功 能: 送格式化输出到串中   返回值: 正常情况下返回生成字串的长度(除去/0),错误情况返回负值   用 法: int vsprintf(char *string, char *format, va_list param);   注: 该函数会出现内存溢出情况,建议使用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;   }

    最新回复(0)