封装一个可变参数打印函数

2023-11-10

在开发中,经常会用到打印,而这些打印在程序运行阶段不需要,仅在调试或开启现象的时候需要,我们用printf来打印往往不能对其进行灵活的控制,这个时候,我们就可以自己封装一个与printf功能相同的打印函数,加一些调试开关,就可以。

用到的接口:


#include <stdarg.h>

       int vprintf(const char *format, va_list ap);

#include <stdio.h>

       int vsnprintf(char *str, size_t size, const char *format, va_list ap);

vprintf() write output to std‐out, the standard output stream; 这是一个标准输出流函数。

vsnprintf() write at most size bytes (including the terminating null byte ('\0')) to str. 这个函数将包括空字符在内的字节写进字符串。

另外两个遍历参数的函数接口:

#include <stdarg.h>


void va_start(va_list ap, last);


void va_end(va_list ap);

解释摘自linux man手册

va_start()
       The va_start() macro initializes ap for subsequent use by va_arg() and va_end(), and must be called first.

       The argument last is the name of the last argument before the variable argument list, that is, the last argument of which the calling function knows  the
       type.

       Because  the address of this argument may be used in the va_start() macro, it should not be declared as a register variable, or as a function or an array
       type.
va_end()
       Each invocation of va_start() must be matched by a corresponding invocation of va_end() in the same function.  After the call va_end(ap) the variable  ap
       is undefined.  Multiple traversals of the list, each bracketed by va_start() and va_end() are possible.  va_end() may be a macro or a function.
 

 

注意,这两个函数成对使用。

封装可变参数打印函数:

#include <stdarg.h>


#define DEBUG_SIZE 1024

void Debugoutput(const char * pcFmt, ...)/* valuable */
{
    char szFormt[DEBUG_SIZE];
    va_list valist;

    va_start(valist, pcFmt);
    
    vsnprintf(szFormt, sizeof(szFormt), pcFmt, valist);
    
    vprintf(szFormt, valist);

    va_end(valist);

    return;
}

测试结果:

int main(void)
{
    Debugoutput("here are some  info to show. your name:%s, your age:%d, your birth:%s, your home:%s.\n", 
                "lily", 21, "1998-02-14", "Shanghai-China");
    return 0;
}

here are some  info to show. your name:lily, your age:21, your birth:1998-02-14, your home:Shanghai-China.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

封装一个可变参数打印函数 的相关文章

随机推荐

  • minikube 实战篇 - 镜像打包部署 - 1

    实战篇 镜像打包 如果你是一个JAVA开发人员 需要把spring项目部署到minikube中 该怎么操作是一个需要探索的问题 这篇文章会讲解如何打包部署项目 1 生成demo项目 在浏览器端输入https start spring io
  • 第9章 Stata聚类分析

    目录 9 1划分聚类分析 1 数标准化处理 2 K个平均数的聚类分析 3 K个中位数的聚类分析 案例延伸 1 采用其他相异性指标 2 设置聚类变量的名称 3 设置观测样本为初始聚类中心 4 排除作为初始聚类中心的观测样本 9 2层次聚类分析
  • gdb 常用命令

    run r 运行 运行带参数的可执行文件 r 后面接参数 例如 gdb executablefile gdb r arg1 arg2 arg3 continue c 继续运行 next n 单步运行 step s 如果有函数则进入函数执行
  • Python 列表推导式、矩阵、格式化输出

    列表推导式 列表推导式提供了从列表 元组创建列表的简单途径 语法 表达式 for语句 if语句 创建并返回一个列表 if语句可选 示例 list1 1 2 3 4 使用元组也行 list2 x 2 for x in list1 print
  • Node.js 学习系列(四)—— 回调函数

    Node js 异步编程的直接体现就是回调 异步编程依托于回调来实现 但不能说使用了回调后程序就异步化了 回调函数在任务完成后就会被调用 Node 使用了大量的回调函数 Node 的所有 API 都支持回调函数 例如 我们可以一边读取文件
  • 【干货】dockerfastdfs集群

    正文 最近整理了一份 Netty 相关的文档干货 讲解很系统 今天分享给大家 看完这份文档你将获得哪些收获 理解当下火热的 Netty 框架 核心概念 开发流程 手写 RPC 框架 聊天室 Tomcat等 对照知识点进行查漏补缺 帮助扫除知
  • 类 AudioInputStream 说明文档 中文版

    javax sound sampled 类 AudioInputStreamjava lang Object java io InputStream javax sound sampled AudioInputStream 所有已实现的接口
  • angular 整理

    文章目录 网址 npm 知识点 参考 https www cnblogs com wjw1014 p 10262309 html 网址 angular https angular cn docs ag grid https www ag g
  • RHEL6.4启动一直在加载界面,无法进入图形化界面的解决办法

    在下在上午的时候将我另一个机器上面的虚拟机拷贝到了我现在用的机器上 发现rhel6 4启动加载的时候一直开在这个界面 如图 就一直卡在这个界面了 我用ctrl shift f1一看 哎 有点迷 咋回事啊 为了验证 我将我原来的机器也打开看了
  • 猪齿鱼平台的部署教程

    以下是基于猪齿鱼平台的部署教程 安装 Docker 在猪齿鱼平台中 应用会运行在 Docker 容器中 所以首先需要安装 Docker 可以按照以下步骤在 CentOS 7 系统上安装 Docker 安装依赖 sudo yum instal
  • kong认证插件添加第二认证方式

    在认证插件对象 如ldap auth 的anonymous 字段添加第二认证方式 查看ldap的插件设置 anonymous 为basic auth的plugin的consumer id 在Authorization中设置认证密码 user
  • vulnhub-sick0s1.2简单靶场提权

    以下均在测试环境进行 遵纪守法 靶场下载地址 https download vulnhub com sickos sick0s1 2 zip 下载后直接用vm导入 网卡NAT模式即可 首先进行信息收集 nmap 192 168 111 0
  • 500报错及故障排除

    500 Internal Server Error 每次打开网页时 浏览器都会向托管站点的服务器发送请求 服务器将返回请求的数据和响应代码 HTTP响应状态代码指示请求是否成功 500到599范围内的代码表示服务器错误 该错误不是由浏览器或
  • 论文英文参考文献[10]的时候后面多空格_毕业论文格式问题批量修改

    今天 给大家介绍一下毕业论文中常见的格式错误批量修改方法 问题一 英文摘要部分或参考文献的英文标点符号检查 采用ENDNOTE ZOTERO这类文献管理软件直接导入的 不存在这类问题 主要针对不会使用软件的而手动复制编写的参考文献 主要涉及
  • Mysql视图

    文章目录 1 简介 2 视图的操作语法 3 视图检查选项 4 视图的更新与作用 1 简介 视图 view 是一种虚拟存在的表 视图中的数据并不在数据库中实际存在 行和列数据来自定义视图的查询中使用的表 并且是在使用视图时动态生成的 通俗来讲
  • 缺页中断过程详解

    缺页中断机构 总而言之 对于我们的缺页的访问 会发生一个缺页中断 缺页中断由当前指令发出 所以属于内中断 中断后该程序就阻塞了 然后等待中断程序结束 再执行 中断程序判断 内存中是否有空闲内存块 如果有 就调入该内存块 并且修改页表项 如果
  • 【thinkphp5】使用tp5开发api接口 定义全局异常处理

    1 新建文件夹以及文件 路径 application lib exception ExceptionHandler php 并键入以下代码
  • Eigen库Vector3d定义及赋值学习

    include
  • JVM--基础--20--对象的创建过程

    JVM 基础 20 对象的创建过程 1 对象的创建过程 讨论的对象限于普通Java对象 不包括数组和Class对象等 虚拟机遇到一条new指令时 过程如下 1 1 类加载 当虚拟机遇到一条new指令时 首先去检查这个指令的参数是否能在常量池
  • 封装一个可变参数打印函数

    在开发中 经常会用到打印 而这些打印在程序运行阶段不需要 仅在调试或开启现象的时候需要 我们用printf来打印往往不能对其进行灵活的控制 这个时候 我们就可以自己封装一个与printf功能相同的打印函数 加一些调试开关 就可以 用到的接口