首页 > 代码库 > va_list中的_vsntprintf使用介绍
va_list中的_vsntprintf使用介绍
相信大家都用过sprintf这个函数,就是下面这样:
int sprintf( char *buffer, const 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");
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。