• 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");
     
     
     
  • 相关阅读:
    调研《构建之法》指导下的历届作品
    需求分析与原型设计
    软件工程的实践项目课程的自我目标
    php 字符串的一些操作,以便记忆
    MOTT的学习(一)
    session,cookie
    php Curl_setop 的学习
    使用Git进行代码管理的心得
    搭建andiord sdk和安装eclipse adt插件的个人小体会
    这些天自身努力的体会,关于java方面的
  • 原文地址:https://www.cnblogs.com/sixbeauty/p/3868177.html
Copyright © 2020-2023  润新知