概述

  • 本文演示环境: 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语言之可变长参数格式化的更多相关文章

  1. [转]深度探索C语言函数可变长参数

    转自:http://www.cnblogs.com/chinazhangjie/archive/2012/08/18/2645475.html 一.基础部分 1.1 什么是可变长参数 可变长参数:顾名 ...

  2. C语言开发具有可变长参数的函数的方法

    学习交流可加 微信读者交流①群 (添加微信:coderAllen) 程序员技术QQ交流①群:736386324 --- 前提:ANSI C 为了提高可移植性, 通过头文件stdarg.h提供了一组方便 ...

  3. C++ 系列:函数可变长参数

    一.基础部分 1.1 什么是可变长参数 可变长参数:顾名思义,就是函数的参数长度(数量)是可变的.比如 C 语言的 printf 系列的(格式化输入输出等)函数,都是参数可变的.下面是 printf ...

  4. 可变长参数列表误区与陷阱——va_arg不可接受的类型

    可变长参数列表误区与陷阱--va_arg不可接受的类型 实现一个有可变长参数列表函数的时候,会使用到stdarg.h(这里不讨论varargs.h)中提供的宏. 例如,我们要实现一个简易的my_pri ...

  5. go实例—函数或方法的可变长参数

    支持可变长参数列表的函数可以支持任意个传入参数,比如fmt.Println函数就是一个支持可变长参数列表的函数. 需要注意的是,可变长参数应该是函数定义的最右边的参数,即最后一个参数 package ...

  6. 关于C中可变长参数

    前言 可变长参数指函数的参数个数在调用时才能确定的函数参数.基本上各种语言都支持可变长参数,在特定情形下,可变长参数使用起来非常方便.c语言中函数可变长参数使用“...”来表示,同时可变长参数只能位于 ...

  7. python基础语法5 函数定义,可变长参数

    函数 1.什么是函数 函数就是一种工具. 可以重复调用 2.为什么要用函数 1.防止代码冗(rong)余 2.代码的可读性差 3.怎么用函数 1.定义函数-->制造工具 2.调用函数--> ...

  8. 0521Day03命名规范 Data函数 可变长参数 枚举类型

    [重点] 命名规范 枚举类型 Date函数 可变长参数 pirnt,println 命名规范 1. 驼峰命名法:main,username,setUsername 用于变量.方法的命名 2. Pasc ...

  9. 在Python中使用可变长参数列表

    函数定义 在函数定义中使用*args和**kwargs传递可变长参数. *args用作传递非命名键值可变长参数列表(位置参数); **kwargs用作传递键值可变长参数列表 函数调用 在调用函数时,使 ...

随机推荐

  1. Codeforces 547E - Mike and Friends(AC 自动机+树状数组)

    题面传送门 好久每做过 AC 自动机的题了--做几个题回忆一下罢 AC 自动机能够解决多串匹配问题,注意是匹配,碰到前后缀的问题那多半不在 AC 自动机能解决的范围内. 在初学 AC 自动机的时候相信 ...

  2. R语言与医学统计图形-【25】ggplot图形分面

    ggplot2绘图系统--图形分面 ggplot2的分面faceting,主要有三个函数: facet_grid facet_wrap facet_null (不分面) 1. facet_grid函数 ...

  3. 金蝶EAS——登录某个数据中心门户时报错“获取用户相关信息失败!请查看服务器日志,并确认是否数据库设置错误或者版本不匹配!”

    登录服务器后台,查看金蝶BOS控制台,选择数据中心中的目标数据中心,点击测试连接,提示报错如下: 说明是数据库问题,需要登录数据库服务器去检查数据库.详细操作见:

  4. linux sort 命令详解(转载)

    转载:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html#3374576 sort是在Linux里非常常用的一个命令,管排序的 ...

  5. Excel—在Excel中利用宏定义实现MD5对字符串(如:手机号)或者文件加密

    下载宏文件[md5宏] 加载宏 试验md5加密 可能遇到的问题 解决办法 下载宏文件[md5宏] 下载附件,解压,得md5宏.xla md5宏.zip 加载宏 依次打开[文件]-[选项]-[自定义功能 ...

  6. 25-ZigZag Conversion

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  7. 18-Rotate Array-Leetcode

    Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array ...

  8. QQ空间技术架构之深刻揭秘

    QQ空间技术架构之深刻揭秘 来源: 腾讯大讲堂  发布时间: 2012-05-17 17:24  阅读: 7822 次  推荐: 4   [收藏]   QQ 空间作为腾讯海量互联网服务产品,经过近七年 ...

  9. react native安装遇到的问题

    最近学习react native 是在为全栈工程师而努力,看网上把react native说的各种好,忍不住学习了一把.总体感觉还可以,特别是可以开发android和ios这点非常厉害,刚开始入门需要 ...

  10. Hi3516开发笔记(六):通过HiTools使用USB/串口将uboot、kernel、roofts和userdata按照分区表烧写镜像

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121706033红胖子(红模仿)的博文大全:开发技术集合( ...