vsnprintf的作用和使用

Posted qlexcel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vsnprintf的作用和使用相关的知识,希望对你有一定的参考价值。

  vsnprintf用来将可变参数格式化输出到一个字符数组,常和va_start和va_end一起使用。

vsnprintf函数介绍

函数功能:将可变参数格式化输出到一个字符数组。

注意:
在linux环境下是:vsnprintf
但在VC6环境下是:_vsnprintf

头文件:#include <stdarg.h>
函数声明:int vsnprintf(char *str, size_t size, const char *format, va_list ap);
参数:

  • str
    保存输出字符数组的存储区。

  • size
    存储区的大小。

  • format
    包含格式字符串的C字符串,其格式字符串与printf中的格式相同

  • arg
    变量参数列表,用va_list 定义。

返回值:
执行成功,返回最终生成字符串的长度,若生成字符串的长度大于size,则将字符串的前size个字符复制到str,同时将原串的长度返回(不包含终止符);执行失败,返回负值,并置errno.

使用例子

#include <stdio.h>
#include <stdarg.h>

#define MAXLEN 20
char buffer[MAXLEN];

int mon_log(char* format, ...)
{
    int i=0,j=0;
    va_list vArgList;                           
    va_start (vArgList, format);      	
    i=_vsnprintf(buffer, MAXLEN, format, vArgList);/*把可变参数表中的数据转成字符存到buffer中,每个参数间用','隔开 */ 
    va_end(vArgList);                            

    printf("%s\\r\\n", buffer);   

    for(j=0;j<MAXLEN;j++)  /*打印buffer中每个字符的值 */
    {
        printf("%d  ", buffer[j]);
    }
    printf("\\r\\n");
    return i;
}

void main()
{   
	int i;

	for(i=0;i<MAXLEN;i++)
		buffer[i]=100;

    i=mon_log("%s,%d,%d,%c","abc",2,3,'4');    
    printf("return value1=%d\\r\\n\\r\\n",i);

    i=mon_log("para1:%s,%d,%d,%c","123",2,3,'4');    
    printf("return value2=%d\\r\\n\\r\\n",i);

    i=mon_log("%s,%d,%d,last=%c\\r\\n","abc",2,3,'4');    
    printf("return value3=%d\\r\\n\\r\\n",i);
}

  在vc6中运行后的结果:

abc,2,3,4
97  98  99  44  50  44  51  44  52  0  100  100  100  100  100  100  100  100  100  100
return value1=9

para1:123,2,3,4
112  97  114  97  49  58  49  50  51  44  50  44  51  44  52  0  100  100  100  100
return value2=15

abc,2,3,last=4

97  98  99  44  50  44  51  44  108  97  115  116  61  52  13  10  0  100  100  100
return value3=16

Press any key to continue

mon_log函数的第一个参数是格式字符串,与printf一样用来设置后面参数格式的。
mon_log("%s,%d,%d,last=%c\\r\\n","abc",2,3,'4');生成的字符串与printf("%s,%d,%d,last=%c\\r\\n","abc",2,3,'4');相同。

以上是关于vsnprintf的作用和使用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用vsprintf, vsnprintf等函数

如何使用vsprintf, vsnprintf等函数

如何使用vsprintf, vsnprintf等函数

替换或删除后台堆栈上现有片段的代码不起作用

无法解析的外部符号 __imp__vsnprintf

Javascript代码片段在drupal中不起作用