_vsnprintf,C语言库函数之一,属于可变参数。用于向字符串中打印数据、数据格式用户自定义。

函数简介

编辑

头文件:
#include <stdarg.h>
函数声明:
int _vsnprintf(char* str, size_t size, const char* format, va_list ap);
参数说明:
  1. char *str [out],把生成的格式化的字符串存放在这里.
  2. size_t size [in], str可接受的最大字符数[1]  (非字节数,UNICODE一个字符两个字节),防止产生数组越界.
  3. const char *format [in], 指定输出格式的字符串,它决定了你需要提供的可变参数的类型、个数和顺序。
  4. va_list ap [in], va_list变量. va:variable-argument:可变参数
函数功能:将可变参数格式化输出到一个字符数组。
用法类似于vsprintf,不过加了size的限制,防止了内存溢出(size为str所指的存储空间的大小)。
返回值:执行成功,返回写入到字符数组str中的字符个数(不包含终止符),最大不超过size;执行失败,返回负值,并置errno.[2] 
备注:
linux环境下是:vsnprintf
VC6环境下是:_vsnprintf
 

用法实例

 #include <stdio.h>
#include <stdarg.h>
int mon_log(char* format, ...)
{
char str_tmp[];
int i=;
va_list vArgList; //定义一个va_list型的变量,这个变量是指向参数的指针.
va_start (vArgList, format); //用va_start宏初始化变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数
i=_vsnprintf(str_tmp, , format, vArgList); //注意,不要漏掉前面的_
va_end(vArgList); //用va_end宏结束可变参数的获取
return i; //返回参数的字符个数中间有逗号间隔
}
//调用上面的函数
void main() 
{
int i=mon_log("%s,%d,%d,%d","asd",,,);
printf("%d\n",i);
}
输出 9。
asd,2,3,4
123456789 (共9个字符,间隔符逗号计算在内)[2] 

返回值用法

 #include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
char *make_message(const char *fmt, ...)
{
/* 初始时假设我们只需要不超过100字节大小的空间 */
int n, size = ;
char *p;
va_list ap;
if ( (p = (char *) malloc(size*sizeof(char))) == NULL)
return NULL;
while ()
{
/* 尝试在申请的空间中进行打印操作 */
va_start(ap, fmt);
n = vsnprintf (p, size, fmt, ap);
va_end(ap);
/* 如果vsnprintf调用成功,返回该字符串 */
if (n > - && n < size)
return p;
/* vsnprintf调用失败(n<0),或者p的空间不足够容纳size大小的字符串(n>=size),尝试申请更大的空间*/
size *= ; /* 两倍原来大小的空间 */
if ((p = (char *)realloc(p, size*sizeof(char))) == NULL)
return NULL;
}
}
int main()
{
/* 调用上面的函数 */
char* str = make_message("%d,%d,%d,%d",,,,);
printf("%s\n",str);
free(str);
/* we allocate the memory in the make_message function, so we should release it by caller(main function). */
return ;
}

_vsnprintf在可变参数打印中的用法的更多相关文章

  1. [lua] 你所不知道的lua nil值在可变参数函数中怎么处理!

    在lua中, 问题1:如果你在可变参数...中传入若干个参数,其中有的参数要带nil,这时怎么解决呢?(比如local function _test(...) end    _test(1, nil, ...

  2. 利用可变参数打印log

    // ConsoleApplication1.cpp: 定义控制台应用程序的入口点. // #pragma once #include <string> #include <Wind ...

  3. 利用可变参数打印log2

    #pragma once #include <string> #include "StdAfx.h" #include <Windows.h> using ...

  4. C语言如何在可变参数函数中使用printf?

    我要将printf外面再包上一层:void fun(const char* fmt,...) {........printf(fmt,...);........}这种函数怎么写? 对比下printf与 ...

  5. Linux可变参数打印日志(二)

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

  6. C# 中的可变参数方法(VarArgs)

    首先需要明确一点:这里提到的可变参数方法,指的是具有 CallingConventions.VarArgs 调用约定的方法,而不是包含 params 参数的方法.可以通过MethodBase.Call ...

  7. C语言中可变参数的使用

    在C语言程序编写中我们使用最多的函数一定包括printf以及很多类似的变形体.这个函数包含在C库函数中,定义为 int printf( const char* format, ...); 除了一个格式 ...

  8. Linux 打印可变参数日志

    实现了传输进去的字符串所在的文档,函数和行数显示功能. 实现了将传入的可变参数打印到日志功能. #include<stdio.h> #include<stdarg.h> #in ...

  9. C语言中可变参数函数实现原理

    C函数调用的栈结构 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈.例如,对于函数: void fu ...

随机推荐

  1. 【PAT】1001. 害死人不偿命的(3n+1)猜想 (15)

    1001. 害死人不偿命的(3n+1)猜想 (15) 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去, ...

  2. 小甲鱼Python笔记(类)

    类和对象 类的构造方法 def __init__(): 1 class People: 2 def __init__(self,name): 3 self.name = name 注意:在构造方法中的 ...

  3. HashMap在Java1.7与1.8中的区别

    基于JDK1.7.0_80与JDK1.8.0_66做的分析 JDK1.7中 使用一个Entry数组来存储数据,用key的hashcode取模来决定key会被放到数组里的位置,如果hashcode相同, ...

  4. webpack3.0+总结

    ul>li{ color:blue; font-size:20px } .items>ul>li>ul>li{ color:crimson } --> webpac ...

  5. 转:WebGL、Asm.js和WebAssembly概念简介

    WebGL.Asm.js和WebAssembly概念简介 转:http://www.techbrood.com/zh/news/webgl/webgl%E3%80%81asm_js%E5%92%8Cw ...

  6. springMVC返回modelmap跟new hashMap的区别

    今天遇到了个坑. 在springboot中 平时写接口,newHashMap,@ResponseBody 返回json对象,没什么问题 @RequestMapping("url") ...

  7. XPath中的text()和string()区别(转)

    原文地址 : http://blog.csdn.net/jiangchao858/article/details/63314426 本质区别 text()是一个node test,而string()是 ...

  8. POJ2955【区间DP】

    题目链接[http://poj.org/problem?id=2955] 题意:[].()的匹配问题,问一个[]()串中匹配的字符数,匹配方式为[X],(X),X为一个串,问一个长度为N(N<= ...

  9. 【BZOJ 4070】【APIO 2015】雅加达的摩天楼

    http://www.lydsy.com/JudgeOnline/problem.php?id=4070 分块建图. 对每个\(P_i\)分类讨论,\(P_i>\sqrt N\)则直接连边,边数 ...

  10. [NOI2015]寿司晚宴 --- 状压DP

    [NOI2015]寿司晚宴 题目描述 为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴. 小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿 ...