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);    //第三步
    va_end(args);                            //第四步

    //在这里对字符串  szBuf  作处理,输出到日志文件或直接打印信息

    //********************************************************
    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");
 
 
 
原文地址:https://www.cnblogs.com/sixbeauty/p/3868177.html