zoukankan      html  css  js  c++  java
  • 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");
     
     
     
  • 相关阅读:
    Making a CocoaPod
    关于Http
    The podfile
    iOS 8个实用小技巧(总有你不知道的和你会用到的)
    关于深拷贝浅拷贝
    适配ios10(iTunes找不到构建版本)
    iOS 10 推送的简单使用
    __block 和 __weak的区别
    Masonry使用注意事项
    iOS数字键盘自定义按键
  • 原文地址:https://www.cnblogs.com/sixbeauty/p/3868177.html
Copyright © 2011-2022 走看看