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. AT695 マス目

    AT695 マス目 本题选自 DP 优化方法大杂烩 状压部分. 这个题很 nb.下文记 \(n=H\),\(m=W\). 对于每一列,如果只记录一个格子是否为黑色,那么发现它无法处理从右边绕到左边再绕 ...

  2. miRNA分析--比对(二)

    miRNA分析--数据过滤(一) 在比对之前为了减少比对时间,将每一个样本中的reads进行合并,得到fasta格式,其命名规则如下: 样本_r数子_x数字 r 中的数字表示reads序号: x 中的 ...

  3. TP、PHP同域不同子级域名共享Session、单点登录

    TP.PHP同域不同子级域名共享Session.单点登录 目的: 为了部署同个域名下不同子级域名共享会话,从而实现单点登录的问题,一处登录,同域处处子系统即可以实现自动登录. PHP支持通过设置coo ...

  4. 简单mvc框架核心笔记

    简单mvc框架核心笔记 看了thinkphp5的源码,模仿写了一个简单的框架,有一些心得笔记,记录一下 1.目录结构 比较简单,没有tp那么复杂,只是把需要的核心类写了一些. 核心类库放在mykj里, ...

  5. Ubuntu 和 windows1下文件夹共享的指令

    第一个是通过拖拉的方式将文件放到当前的目录下面,即 mv +路径 + . 第二个是将文件放到了硬盘里面/mnt/hgfs/linusshare/里面

  6. 求解线性递推方程第n项的一般方法

    概述 系数为常数,递推项系数均为一次的,形如下面形式的递推式,称为线性递推方程. \[f[n]=\begin{cases} C &n\in Value\\ a_1 f[n-1]+a_2 f[n ...

  7. TLSv1.3 Support:主流 Web 客户端和服务端对 TLSv1.3 的支持情况

    TLSv1.3 Support:主流 Web 客户端和服务端对 TLSv1.3 的支持情况 请访问原文链接:https://sysin.org/blog/tlsv1-3-support/,查看最新版. ...

  8. NuxtJS的AsyncData和Fetch使用详解

    asyncData 简介 asyncData 可以用来在客户端加载 Data 数据之前对其做一些处理,也可以在此发起异步请求,提前设置数据,这样在客户端加载页面的时候,就会直接加载提前渲染好并带有数据 ...

  9. Ubuntu下STL源码文件路径+VS2010下查看STL源码

    Ubuntu版本信息 然后STL源码位置就在 /usr/include/c++/7/bits /usr/include/c++/7.4.9/bits 这两个文件下都有 然后我日常写程序用的Window ...

  10. D3-更改x轴的标签

    记录,上代码