void Log( const TCHAR *pszFormat, ... ) { TCHAR buf[1024] ; va_list arglist ; try { _tcscpy_s ( buf, 1023, _T(" ") ) ; va_start(arglist, pszFormat) ;
// Type xx = va_arg( arglist, Type );
//依次获取指定参数,定义类型必须相同
_vstprintf_s(&buf[_tcslen(buf)], 1023-_tcslen(buf), pszFormat, arglist) ; va_end(arglist) ; _tprintf ( buf ) ; } catch ( ... ){} }
INTSIZEOF 宏,获取类型占用的空间长度,最小占用长度为int的整数倍:
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
VA_START宏,获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,v是可变参数最左边的参数):
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
VA_ARG宏,获取可变参数的当前参数,返回指定类型并将指针指向下一参数(t参数描述了当前参数的类型):
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
VA_END宏,清空va_list可变参数列表:
#define va_end(ap) ( ap = (va_list)0 )
2. 格式化注意% 字符串
#include "stdafx.h" #include <stdarg.h> unsigned int net_Printf(const char *psz_fmt, ... ) { char psz [4096] = {0}; va_list args; va_start( args, psz_fmt ); int i_size = vsprintf( psz, psz_fmt, args ); printf("%s", psz); if( i_size == -1 ) return -1; va_end( args ); return 0; } int _tmain(int argc, _TCHAR* argv[]) { char str[4096] = {"abcd%12%3s%20d"}; net_Printf(str); return 0; }
结果输出:“0x0012de7c "abcd%3s 0"
解析:"abcd%12%3s%20d"
- "%12%" 将会变为”%“,第一个%号转义,12 表示 在"%"和字母之间插进数字表示最大场宽。
- "3s" 直接显示
- "%20d" 20表示最大宽度,默认空格填充了,%d 默认0显示。
如是想获得原串,可以加 %转义,
char str[4096] = {"abcd%%12%%3s%%20d"};