C语言之可变长参数格式化
概述
- 本文演示环境: win10 + Vs2015
可变长参数格式化
两个概念: 1. 参数长度不定, 2. 参数格式化。
使用函数 vsnprintf 结合 va_list。
源码
写好了函数, 照搬就行啦。
头文件
#include <stdarg.h>
#include <stdio.h>
函数
std::string str_format_(const char* pformat, ...)
{
va_list argptr;
va_start(argptr, pformat);
/// 计算格式化字符串的长度
int size = vsnprintf(NULL, NULL, pformat, argptr);
if (0 == size)
{
va_end(argptr);
return std::string("");
}
/// 申请缓冲区 , +1是为了存放结束符
char* pbuf = (char*)malloc(size + 1);
/// 申请失败,记得释放VAlist
if (NULL == pbuf)
{
va_end(argptr);
return std::string("");
}
/// 将数据写入申请的缓冲区
int write_len = vsnprintf(pbuf, size, pformat, argptr);
pbuf[write_len] = '\0';
/// 释放VA
va_end(argptr);
/// 构造函数返回值
std::string ret(pbuf);
/// 释放申请的缓冲区
free(pbuf);
pbuf = NULL;
return ret;
}
使用范例
using namespace std;
std::string str;
/// 范例1
str = str_format_("%04d-%02d-%02d", 2021, 3, 26);
cout << "\n\n\n str1=" << str.c_str() << "\n\n\n";
/// 范例2
str = str_format_("this is a format %c", "function");
cout << "str2=" << str.c_str() << "\n\n\n\n";
输出结果

完整演示代码
#include <iostream>
#include <stdarg.h>
#include <stdio.h>
std::string str_format_(const char* pformat, ...)
{
va_list argptr;
va_start(argptr, pformat);
/// 计算格式化字符串的长度
int size = vsnprintf(NULL, NULL, pformat, argptr);
if (0 == size)
{
va_end(argptr);
return std::string("");
}
/// 申请缓冲区 , +1是为了存放结束符
char* pbuf = (char*)malloc(size + 1);
/// 申请失败,记得释放VAlist
if (NULL == pbuf)
{
va_end(argptr);
return std::string("");
}
/// 将数据写入申请的缓冲区
int write_len = vsnprintf(pbuf, size, pformat, argptr);
pbuf[write_len] = '\0';
/// 释放VA
va_end(argptr);
/// 构造函数返回值
std::string ret(pbuf, write_len);
/// 释放申请的缓冲区
free(pbuf);
pbuf = NULL;
return ret;
}
int main(int argc, char* argv[], char *env[])
{
using namespace std;
std::string str;
/// 范例1
str = str_format_("%04d-%02d-%02d", 2021, 3, 26);
cout << "\n\n\n str1=" << str.c_str() << "\n\n\n";
/// 范例2
str = str_format_("this is a format %c", "function");
cout << "str2=" << str.c_str() << "\n\n\n\n";
system("pause");
return 0;
}
C语言之可变长参数格式化的更多相关文章
- [转]深度探索C语言函数可变长参数
转自:http://www.cnblogs.com/chinazhangjie/archive/2012/08/18/2645475.html 一.基础部分 1.1 什么是可变长参数 可变长参数:顾名 ...
- C语言开发具有可变长参数的函数的方法
学习交流可加 微信读者交流①群 (添加微信:coderAllen) 程序员技术QQ交流①群:736386324 --- 前提:ANSI C 为了提高可移植性, 通过头文件stdarg.h提供了一组方便 ...
- C++ 系列:函数可变长参数
一.基础部分 1.1 什么是可变长参数 可变长参数:顾名思义,就是函数的参数长度(数量)是可变的.比如 C 语言的 printf 系列的(格式化输入输出等)函数,都是参数可变的.下面是 printf ...
- 可变长参数列表误区与陷阱——va_arg不可接受的类型
可变长参数列表误区与陷阱--va_arg不可接受的类型 实现一个有可变长参数列表函数的时候,会使用到stdarg.h(这里不讨论varargs.h)中提供的宏. 例如,我们要实现一个简易的my_pri ...
- go实例—函数或方法的可变长参数
支持可变长参数列表的函数可以支持任意个传入参数,比如fmt.Println函数就是一个支持可变长参数列表的函数. 需要注意的是,可变长参数应该是函数定义的最右边的参数,即最后一个参数 package ...
- 关于C中可变长参数
前言 可变长参数指函数的参数个数在调用时才能确定的函数参数.基本上各种语言都支持可变长参数,在特定情形下,可变长参数使用起来非常方便.c语言中函数可变长参数使用“...”来表示,同时可变长参数只能位于 ...
- python基础语法5 函数定义,可变长参数
函数 1.什么是函数 函数就是一种工具. 可以重复调用 2.为什么要用函数 1.防止代码冗(rong)余 2.代码的可读性差 3.怎么用函数 1.定义函数-->制造工具 2.调用函数--> ...
- 0521Day03命名规范 Data函数 可变长参数 枚举类型
[重点] 命名规范 枚举类型 Date函数 可变长参数 pirnt,println 命名规范 1. 驼峰命名法:main,username,setUsername 用于变量.方法的命名 2. Pasc ...
- 在Python中使用可变长参数列表
函数定义 在函数定义中使用*args和**kwargs传递可变长参数. *args用作传递非命名键值可变长参数列表(位置参数); **kwargs用作传递键值可变长参数列表 函数调用 在调用函数时,使 ...
随机推荐
- hdu 5552 Bus Routes
hdu 5552 Bus Routes 考虑有环的图不方便,可以考虑无环连通图的数量,然后用连通图的数量减去就好了. 无环连通图的个数就是树的个数,又 prufer 序我们知道是 $ n^{n-2} ...
- P3571 [POI2014]SUP-Supercomputer
*X. P3571 [POI2014]SUP-Supercomputer 题意简述:一棵以 \(1\) 为根的树.\(q\) 次询问,每次给出 \(k\),求至少要多少次同时访问不超过 \(k\) 次 ...
- MYSQL5.8---1
主键不能为空,唯一键可以为空且可以多个唯一键 外键必须为另一个表中的主键 外键的用途是确保数据的完整性.它通常包括以下几种: 1 实体完整性,确保每个实体是唯一的(通过主键来实施) 2 域完整性,确保 ...
- zabbix监控php状态
环境介绍: php /usr/loca/php nignx /usr/loca/nginx 配置文件都是放在extra中 修改php-fpm的配置文件启动状态页面 pm.status_path = ...
- Redis | 第10章 二进制数组、慢查询日志和监视器《Redis设计与实现》
目录 前言 1. 二进制位数组 1.1 位数组的表示 1.2 GETBIT 命令的实现 1.3 SETBIT 命令的实现 1.4 BITECOUNT 命令的实现 1.5 BITOP 命令的实现 2. ...
- 【NetCore】RabbitMQ 封装
RabbitMQ 封装 代码 https://gitee.com/wosperry/wosperry-rabbit-mqtest/tree/master 参考Abp事件总线的用法,对拷贝的Demo进行 ...
- 云原生时代,为什么基础设施即代码(IaC)是开发者体验的核心?
作者 | 林俊(万念) 来源 |尔达 Erda 公众号 从一个小故事开始 你是一个高级开发工程师. 某天,你自信地写好了自动煮咖啡功能的代码,并在本地调试通过.代码合并入主干分支后,你准备把服务发布到 ...
- day8 基本数据类型之字典
day8 基本数据类型之字典 一.字典(dict) 1.用途: 2.定义方式:在{}内用逗号分隔开多个元素,每个元素都是key:value的形式,其中value可以使任意类型,而key必须是不可变类型 ...
- Linux网络(网络模型和收发流程)
网络模型 为了解决网络互联中异构设备的兼容性问题,并解耦复杂的网络包处理流程,国际标准化组织制定的开放式系统互联通信参考模型(Open System Interconnection Reference ...
- 大数据学习day16------第三阶段-----scala04--------1. 模式匹配和样例类 2 Akka通信框架
1. 模式匹配和样例类 Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配 1.1 模式匹 ...