首页 > 代码库 > va_list中的_vsntprintf使用介绍

va_list中的_vsntprintf使用介绍

相信大家都用过sprintf这个函数,就是下面这样:
int sprintf( char *bufferconst char *format [, argument] ... );
在之前看到了用va_list实现的几个处理字符串的函数,基本都是这种形式的,感到非常好用,今天来谈一下 va_list 的使用问题。
 va_list的用法和原理网上一大堆,我都懒得抄了,大概介绍一下它的用法就好:
第一步:定义一个 va_list变量 。
第二步:使用  va_start  函数初始化这个变量。
第三步:对上面的变量操作。
第四步:使用 va_end 清空va_list可变参数列表。
1. va_list args;2. va_start(args,sz);3. ...4. va_end(args);

  

关键是第三步那里的操作,一般是用 va_arg来取参数:
#include<iostream>#include<stdarg.h>    //注意这个头文件using namespace std;void  ContentStr(char *sz,...){    const char* pstr=0;    va_list args;     //第一步    va_start(args,sz);  //第二步    cout<<sz<<endl;    pstr=va_arg(args,const char*);   //第三步     cout<<pstr<<endl;        int num=va_arg(args,int);      //还是第三步    cout<<num<<endl;    va_end(args);    //第四步    return ;}int main(){    ContentStr("hahaha","asdf",1);    return 0;}

 

 
不过我要介绍的是  _vsntprintf  这个函数,使用这个函数,我们能写一些直接拼接字符串的函数,如日志记录等的函数:
用法如下:
#include<iostream>#include<stdarg.h>using namespace std;void  LogInfo(char *szFormat,...){    char szBuf[4096]={};    va_list args;                            //第一步    va_start(args,szFormat);                 //第二步    _vsnprintf(szBuf,4096,szFormat,args);    //第三步    //在这里对字符串  szBuf  作处理,输出到日志文件或直接打印信息    //********************************************************    va_end(args);                            //第四步    return ;}int main(){    LogInfo("收到网关服务器中转命令,主命令:%d,副命令:%d,附带信息",1,2,"hahahaha");    return 0;}
 
使用va_list  和 _vsnprintf 能大大提高我们对字符串的处理效率,如果不这样处理,普通的日志记录,我们必须分两个步骤:1.字符串的拼接,2.输出
//拼接日志字符串    char logStr[4096]={};    sprintf(logStr,"收到网关服务器中转命令,主命令:%d,副命令:%d,附带信息:%s",1,2,"hahahaha");    //输出    cout<<logStr<<endl;    //********************************************************    //使用va_list和_vsnprintf配合,大大减少代码冗余    LogInfo("收到网关服务器中转命令,主命令:%d,副命令:%d,附带信息:s%s",1,2,"hahahaha");