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:案例演示 * 需求 ...
随机推荐
- doxygen相关命令
主要配置修改 整个程序配置分几个部分 Project related configuration options 项目相关,包括: 项目名 输出目录 输出语言 是否显示继承属性 是否对C.Java.F ...
- [R]在dplyr函数的基础上编写函数-(3)tidyeval
dplyr的优点很明显,数据框操作简洁,如filter(df, x == 1, y == 2, z == 3)等于df[df$x == 1 & df$y ==2 & df$z == 3 ...
- mac 下 如何在同一窗口打开多个终端并实现快捷键切换
相信大家编代码的时候都会遇到,每次需要在头文件,库文件和源码文件中编代码的时候,总是需要在几个文件中切换来切换去的,而且一个文件就一个终端窗口,每次都要用鼠标点来点去,非常麻烦,所以如果能把这几个文件 ...
- Centos7服务器上RabbitMQ单机安装
一.背景 最近项目中用到了RabbitMQ,但是发现自己本地没有安装,此文记录一下本地RabbitMQ的安装过程.注意不同的系统安装方式略有不同,此处我们记录的是Centos7的安装方式. 二.安装方 ...
- Linux内存管理和寻址详解
1.概念 内存管理模式 段式:内存分为了多段,每段都是连续的内存,不同的段对应不用的用途.每个段的大小都不是统一的,会导致内存碎片和内存交换效率低的问题. 页式:内存划分为多个内存页进行管理,如在 L ...
- C逗号表达式
c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值.如:(3+5,6+8)称为逗号表达式,其求解过程先表达 ...
- Linux基础命令---mirror获取ftp目录
mirror 使用lftp登录ftp服务器之后,可以使用mirror指令从服务器获取目录 1.语法 mirror [OPTS] [source [target]] 2.选项列表 选 ...
- 【Java 8】方法引用
一.概述 在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法.然而,有时候我们仅仅是调用了一个已存在的方法.如下: Arrays.sort(stringsArray,(s1,s ...
- 基于注解的方式搭建mybatis开发框架
1.创建工程 <groupId>com.hope</groupId> <artifactId>day01_eesy_01mybatis</artifa ...
- 如何利用EL表达式获取list,map,对象等值
<%@ page import="com.hopetesting.domain.User" %><%@ page import="java.util.* ...