0、序言

  使用printf函数,其参数就是可变参数。下面将使用 C语言  的库函数实现可变参数的函数 。

  用途(欢迎补充):

    A、记录日志,可能需要将变量格式化输出到日志文件。

    B、格式化字符串,显示结果(A差不多)。

1、使用

  A、头文件

// 使用va_start需要的头文件
#include <stdarg.h>

  B、必须使用下面的3个宏 :

  va_list    va_start    va_end

  C、使用函数: snprintf       (sprintf的升级版,避免缓冲区溢出)

  D、函数范例

void show_str(const char* pstr, ...);

2、一个例子

 1 #include <iostream>
2
3 // 使用va_start需要的头文件
4 #include <stdarg.h>
5
6 void show_str(const char* pstr, ...)
7 {
8 va_list ap;
9 va_start(ap, pstr);
10
11 // 1、计算得到长度
12 //---------------------------------------------------
13 // 返回 成功写入的字符个数
14 int count_write = snprintf(NULL, 0, pstr, ap);
15 va_end(ap);
16
17 // 长度为空
18 if (0 >= count_write)
19 return ;
20
21 count_write ++;
22
23 // 2、构造字符串再输出
24 //---------------------------------------------------
25 va_start(ap, pstr);
26
27 char *pbuf_out = NULL;
28 pbuf_out = (char *)malloc(count_write);
29 if (NULL == pbuf_out)
30 {
31 va_end(ap);
32 return;
33 }
34
35 // 构造输出
36 vsnprintf(pbuf_out, count_write, pstr, ap);
37 // 释放空间
38 va_end(ap);
39
40 // 输出结果
41 std::cout << "str = " << pbuf_out << "\n";
42
43 // 释放内存空间
44 free(pbuf_out);
45 pbuf_out = NULL;
46 }
47
48
49 // 入口函数
50 int main(int argc, char *argv[])
51 {
52 show_str("123, %s, %s", "ABC", "-=+");
53
54 system("pause");
55 return 0;
56 }

  show_str函数实现输出构造好的字符串。

3、结果

  演示环境: VS2015 up3

  输出结果:

4、总结

  A、注意 ,这里是malloc , 需要与 free 配对使用,避免内存泄漏

  B、注意,va_start 需要与 va_end 配对使用。

  

c(++)可变参数之格式化字符串的更多相关文章

  1. C++ 中的不定参数与格式化字符串 # ## vsprintf

    日志打印或者格式字符串时,可能会用到不定参数的使用,这里记录一下. 格式化字符串有很多方法: snprintf std::stringstream # ##的使用 ##是一个连接符号,用于把参数连在一 ...

  2. C、C++格式化字符串

    引言 在C和C++开发中,我们经常会用到printf来进行字符串的格式化,例如printf("format string %d, %d", 1, 2);,这样的格式化只是用于打印调 ...

  3. 字符串化#、拼接字符##和可变参数宏(...和_ _VA_ARGS_ _)

    宏定义的使用与注意事项 ##是一个连接符号,用于把参数连在一起 #是“字符串化”的意思.出现在宏定义中的#是把跟在后面的参数转换成一个字符串#define paster( n ) printf( &q ...

  4. C可变参数的函数

    我们实现一个简单的printf函数(可变参数) #include <stdio.h> #include <stdarg.h> void myprintf(const char ...

  5. [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇

    目录 [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇 格式化输出函数 printf函数族功能介绍 printf参数 type(类型) flags(标志) number(宽度) precisi ...

  6. 格式化字符串漏洞 format string exploit(一)

    本文系原创,转载请说明出处 本文为基于CTF WIKI的PWN学习 0x00 格式化字符串原理 先附一张经典的图,如下 其栈上布局如下: some value 3.14 123456 addr of ...

  7. c++之可变参数格式化字符串(c++11可变模板参数)

    本文将使用 泛型 实现可变参数. 涉及到的关见函数:  std::snprintf 1.一个例子 函数声明及定义 1 // 泛型 2 template <typename... Args> ...

  8. PHP基础语法: echo,var_dump, 常用函数:随机数:拆分字符串:explode()、rand()、日期时间:time()、字符串转化为时间戳:strtotime()可变参数的函数:PHP里数组长度表示方法:count($attr[指数组]);字符串长度:strlen($a)

    PHP语言原理:先把代码显示在源代码中,再通过浏览器解析在网页上 a. 1.substr;  //用于输出字符串中,需要的某一部分 <?PHP $a="learn php"; ...

  9. java-ArrayList中去重复字符串或重复对象、LinkedList集合、泛型、增强for、静态导入、可变参数、asList()方法、集合嵌套

    1.去除ArrayList中重复字符串元素方式 * A:案例演示 * 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同) * 思路:创建新集合方式 /** * A:案例演示 * 需求 ...

随机推荐

  1. Linux 进程与线程

    进程与线程   进程 进程就是在操作系统中运行的程序,是操作系统资源管理的最小单位.一个进程可以管理多个线程,线程相对轻量,可以共享进程地址空间 线程来源 一个进行在运行的过程中,不可能一直占据着CP ...

  2. rabbit mq的php使用 amqp 的支持

    rabbit mq的php使用 php想要操作rabbit 需要扩展amqp 1,先查看自己的php版本 phpinfo() 接下来下载dll文件 地址http://pecl.php.net/pack ...

  3. 在Kubernetes上安装MySQL-PXC集群

    官方部署文档地址:https://www.percona.com/doc/kubernetes-operator-for-pxc/kubernetes.html 一.部署方式 示例在k8s集群(至少3 ...

  4. 学习java 7.17

    学习内容: 计算机网络 网络编程 网络编程三要素 IP地址 端口 协议 两类IP地址 IP常用命令: ipconfig 查看本机IP地址 ping IP地址 检查网络是否连通 特殊IP地址: 127. ...

  5. Spark集群环境搭建——服务器环境初始化

    Spark也是属于Hadoop生态圈的一部分,需要用到Hadoop框架里的HDFS存储和YARN调度,可以用Spark来替换MR做分布式计算引擎. 接下来,讲解一下spark集群环境的搭建部署. 一. ...

  6. What all is inherited from parent class in C++?

    派生类可以从基类中继承: (1)基类中定义的每个数据成员(尽管这些数据成员在派生类中不一定可以被访问): (2)基类中的每个普通成员函数(尽管这些成员函数在派生类中不一定可以被访问): (3)The ...

  7. Linux学习 - 压缩解压命令

    一." .gz "压缩文件 1 压缩语法 gzip  [文件] 2 解压语法 gunzip  [压缩文件] 3 注 gzip只能压缩文件 gzip不保留原文件 二." . ...

  8. SpringMVC原理分析

    Spring MVC主要包括以下要点: 1:由DispatcherServlet控制的整个流程: 2:注解驱动的控制器,其中包括请求映射.数据的绑定和格式化: 3:文件上传: 4:一些杂项,如静态资源 ...

  9. spring注解事务管理

    使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间<beans xmlns="http://www.springframework.org/schema/b ...

  10. ligerUI 关闭父弹窗JS报错问题 解决方法

    1:调用父窗口某一个文件框,获取焦点, parent.window.document.getElementById("roleName").focus(); 2:关闭父窗口pare ...