c(++)可变参数之格式化字符串
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(++)可变参数之格式化字符串的更多相关文章
- C++ 中的不定参数与格式化字符串 # ## vsprintf
日志打印或者格式字符串时,可能会用到不定参数的使用,这里记录一下. 格式化字符串有很多方法: snprintf std::stringstream # ##的使用 ##是一个连接符号,用于把参数连在一 ...
- C、C++格式化字符串
引言 在C和C++开发中,我们经常会用到printf来进行字符串的格式化,例如printf("format string %d, %d", 1, 2);,这样的格式化只是用于打印调 ...
- 字符串化#、拼接字符##和可变参数宏(...和_ _VA_ARGS_ _)
宏定义的使用与注意事项 ##是一个连接符号,用于把参数连在一起 #是“字符串化”的意思.出现在宏定义中的#是把跟在后面的参数转换成一个字符串#define paster( n ) printf( &q ...
- C可变参数的函数
我们实现一个简单的printf函数(可变参数) #include <stdio.h> #include <stdarg.h> void myprintf(const char ...
- [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇
目录 [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇 格式化输出函数 printf函数族功能介绍 printf参数 type(类型) flags(标志) number(宽度) precisi ...
- 格式化字符串漏洞 format string exploit(一)
本文系原创,转载请说明出处 本文为基于CTF WIKI的PWN学习 0x00 格式化字符串原理 先附一张经典的图,如下 其栈上布局如下: some value 3.14 123456 addr of ...
- c++之可变参数格式化字符串(c++11可变模板参数)
本文将使用 泛型 实现可变参数. 涉及到的关见函数: std::snprintf 1.一个例子 函数声明及定义 1 // 泛型 2 template <typename... Args> ...
- PHP基础语法: echo,var_dump, 常用函数:随机数:拆分字符串:explode()、rand()、日期时间:time()、字符串转化为时间戳:strtotime()可变参数的函数:PHP里数组长度表示方法:count($attr[指数组]);字符串长度:strlen($a)
PHP语言原理:先把代码显示在源代码中,再通过浏览器解析在网页上 a. 1.substr; //用于输出字符串中,需要的某一部分 <?PHP $a="learn php"; ...
- java-ArrayList中去重复字符串或重复对象、LinkedList集合、泛型、增强for、静态导入、可变参数、asList()方法、集合嵌套
1.去除ArrayList中重复字符串元素方式 * A:案例演示 * 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同) * 思路:创建新集合方式 /** * A:案例演示 * 需求 ...
随机推荐
- AT695 マス目
AT695 マス目 本题选自 DP 优化方法大杂烩 状压部分. 这个题很 nb.下文记 \(n=H\),\(m=W\). 对于每一列,如果只记录一个格子是否为黑色,那么发现它无法处理从右边绕到左边再绕 ...
- miRNA分析--比对(二)
miRNA分析--数据过滤(一) 在比对之前为了减少比对时间,将每一个样本中的reads进行合并,得到fasta格式,其命名规则如下: 样本_r数子_x数字 r 中的数字表示reads序号: x 中的 ...
- TP、PHP同域不同子级域名共享Session、单点登录
TP.PHP同域不同子级域名共享Session.单点登录 目的: 为了部署同个域名下不同子级域名共享会话,从而实现单点登录的问题,一处登录,同域处处子系统即可以实现自动登录. PHP支持通过设置coo ...
- 简单mvc框架核心笔记
简单mvc框架核心笔记 看了thinkphp5的源码,模仿写了一个简单的框架,有一些心得笔记,记录一下 1.目录结构 比较简单,没有tp那么复杂,只是把需要的核心类写了一些. 核心类库放在mykj里, ...
- Ubuntu 和 windows1下文件夹共享的指令
第一个是通过拖拉的方式将文件放到当前的目录下面,即 mv +路径 + . 第二个是将文件放到了硬盘里面/mnt/hgfs/linusshare/里面
- 求解线性递推方程第n项的一般方法
概述 系数为常数,递推项系数均为一次的,形如下面形式的递推式,称为线性递推方程. \[f[n]=\begin{cases} C &n\in Value\\ a_1 f[n-1]+a_2 f[n ...
- TLSv1.3 Support:主流 Web 客户端和服务端对 TLSv1.3 的支持情况
TLSv1.3 Support:主流 Web 客户端和服务端对 TLSv1.3 的支持情况 请访问原文链接:https://sysin.org/blog/tlsv1-3-support/,查看最新版. ...
- NuxtJS的AsyncData和Fetch使用详解
asyncData 简介 asyncData 可以用来在客户端加载 Data 数据之前对其做一些处理,也可以在此发起异步请求,提前设置数据,这样在客户端加载页面的时候,就会直接加载提前渲染好并带有数据 ...
- Ubuntu下STL源码文件路径+VS2010下查看STL源码
Ubuntu版本信息 然后STL源码位置就在 /usr/include/c++/7/bits /usr/include/c++/7.4.9/bits 这两个文件下都有 然后我日常写程序用的Window ...
- D3-更改x轴的标签
记录,上代码