zoukankan      html  css  js  c++  java
  • va_list

    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"};


     
  • 相关阅读:
    CentOS中文件夹基本操作命令
    Apache和Nginx下禁止访问特定的目录或文件
    自适应网页设计(Responsive Web Design)
    使用Google Https搜索
    AMD 3600+ X2 CPU配合昂达A69T主板超频教程
    dedecms上传图片相对路径改成绝对路径方法
    安装ecshop默认安装后的错误解决方案
    动态加载JS脚本的4种方法
    Java虚拟机(二)对象的创建与OOP-Klass模型
    Android系统启动流程(四)Launcher启动过程与系统启动流程
  • 原文地址:https://www.cnblogs.com/iclk/p/3544675.html
Copyright © 2011-2022 走看看