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. canvas 基本介绍

    # canvas 基本功能介绍 - canvas 能做什么 1. 绘制简单图形线条 2. 裁剪图片 - 开始绘制画布 新建html文档添加 canvas标签 ```html <div style ...

  2. Python pandas merge不能根据列名合并两个数据框(Key Error)?

    目录 折腾 解决方法 折腾 数据分析用惯了R,感觉pandas用起来就有点反人类了.今天用python的pandas处理数据时两个数据框硬是合并不起来. 我有两个数据框,列名是未知的,只能知道索引,以 ...

  3. MYSQL权限全解

    • All/All Privileges权限代表全局或者全数据库对象级别的所有权限 • Alter权限代表允许修改表结构的权限,但必须要求有create和insert权限配合.如果是rename表名, ...

  4. 【Meta】16s rRNA和16s rDNA的区别

    在文章或宣传稿中经常看到两者滥用,实际上是不同的. 首先是各个字母的含义: 16S中的"S"是一个沉降系数,亦即反映生物大分子在离心场中向下沉降速度的一个指标,值越高,说明分子越大 ...

  5. python8 标准模块和第三方模块

  6. eclipse不自动弹出提示的解决办法(eclipse alt+/快捷键失效)

    转载:http://yuncode.net/article/a_53bf6888b6f5065 我的问题:在jsp中使用"alt+/"不能够自动导入java包.利用3,4解决问题 ...

  7. 振鹏学习Java的第二天!

    一.今日收获 1.了解了eclipse的具体使用方法. 2.学习了Java程序设计完全手册的第一章内容,明白了相关知识. 3.通过看哔哩哔哩的java的教程视频了解了Dos命令及java的变量和常量. ...

  8. Applescript快速入门及OmniFocus每日md报告开发

    本篇主要记录 Applescript 基础语法,以及利用 applescript 生成 omnifocus 每日报告 从 windows 转换到 macos,最近一直在不断折腾,这两天浏览 githu ...

  9. 大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

    0.前言 0.1  分布式运算框架的核心思想(此处以MR运行在yarn上为例)  提交job时,resourcemanager(图中写成了master)会根据数据的量以及工作的复杂度,解析工作量,从而 ...

  10. ES6常用的数值转换方法

    <script type="text/javascript"> // Number常用方法 /* Number.isFinite() 用来检查一个数值是否为有限的(fi ...