zoukankan      html  css  js  c++  java
  • va_list & vsprintf & vfprint

    vsprintf & vfprintf

    /* 将格式化的参数列表写入C字符串(字符数组) */
    int vsprintf (char * s, const char * format, va_list arg );
    
    /* 将格式化的参数列表写入文件流 (FILE * stdout) */
    int vfprintf ( FILE * stream, const char * format, va_list arg );
    

    sample

    #include <stdargs.h>
    #include <stdio.h>
    
    void LOGD(const char* fmt, ...)
    {
        va_list args;
        va_start(args, fmt);    // 初始化va_list变量,第二个参数为最后一个显示声明的入参
        char str[256] = {''};
        vsprintf(str, fmt, args);
        printf("INFO: %s
    ", str);
        va_end(args);
    }
    
    void logPrint(int level, const char* msg, ...) 
    {
        va_list args;
        va_start(args, msg);
        vfprintf(stdout, msg, args);
        va_end(args);
        fflush(stdout); /* 清空流缓冲区 */
        return;
    }
    
    

    va_list

    va_list实际上就是一个指针,不同平台定义的不一样。

    typedef char *  va_list;  // x86平台下va_list的定义
    

    va_start、va_arg、va_end都是预定义的宏,操作va_list指针:

    va_start(arg, v)    // 以固定参数的地址为起点确定变参的内存起始地址,arg指向第一个可选参数地址
    va_arg(arg, type)   // 返回第一个可选参数的值,类型为type,并将arg指向下一个参数地址
    va_end(arg)         // arg指针置为NULL
    

    函数参数入栈的顺序是从右往左,依次入栈,va_list指针在函数堆栈中移动时,移动多少与前一个参数的类型有关

    vsprintf

    vsprintf将可变参数列表中的数据写入一个C字符串

    int vsprintf (char * s, const char * format, va_list arg );
    // Write formatted data from variable argument list to string
    
  • 相关阅读:
    一本通1590恨 7 不成妻
    一本通1591数字计数
    一本通1589不要 62
    一本通1588数字游戏
    一本通1587【例 3】Windy 数
    一本通1586【 例 2】数字游戏
    一本通1585【例 1】Amount of Degrees
    一本通1584骑士
    一本通1583叶子的染色
    一本通1581旅游规划
  • 原文地址:https://www.cnblogs.com/cristiano-duan/p/12178101.html
Copyright © 2011-2022 走看看