概述

  • 本文演示环境: 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. Perl 语言入门1-5

    第一章 简介 perl -v 文字处理,编写小型CGI脚本(Web服务器调用程序)的最佳语言 CPAN: Perl综合典藏网 shebang: #! /usr/bin/perl 或#! /usr/lo ...

  2. C#数据库连接方式【简版】

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using ...

  3. typedef定义数组

    typedef定义数组 问题来源 在学习高一凡数据结构与算法解析串这一章节时,遇到如下代码不明白其意义,经过查阅终于搞明白 typedef unsigned char SString[MAXLEN + ...

  4. 日常Java 2021/11/9

    线程的优先级 每一个Java线程都有一个优先级,这样有助于操作系统确定线程的调度顺序.Java线程的优先级是一个整数,其取值范围是1(Thread.MIN_PRIORITY ) -10 (Thread ...

  5. 商业爬虫学习笔记day5

    一. 发送post请求 import requests url = "" # 发送post请求 data = { } response = requests.post(url, d ...

  6. win10产品密钥 win10永久激活密钥(可激活win10所有版本)

    https://www.win7w.com/win10jihuo/18178.html#download 很多人都在找2019最新win10永久激活码,其实win10激活码不管版本新旧都是通用的,也就 ...

  7. VUE页面实现加载外部HTML方法

    前后端分离,后端提供了接口.但有一部分数据,比较产品说明文件,是存在其他的服务器上的.所以,在页面显示的时候,如果以页面内嵌的形式显示这个说明文件.需要搞点事情以达到想要的效果.本文主要和大家介绍VU ...

  8. Dubbo多版本控制

    当系统进行升级时,一般都是采用"灰度发布(又称为金丝雀发布)"过程.即在低压力时段,让部分消费者先调用新的提供者实现类,其余的仍然调用老的实现类,在新的实现类运行没有问题的情况下, ...

  9. 【C/C++】二维数组的传参的方法/二维字符数组的声明,使用,输入,传参

    [问题] 定义了一个子函数,传参的内容是一个二维数组 编译提示错误 因为多维数组作为形参传入时,必须声明除第一位维外的确定值,否则系统无法编译(算不出偏移地址) [二维数组的传参] 方法一:形参为二维 ...

  10. Redis学习推荐资料合集

    目录 一.官方 二.书籍 三.推荐博客 一.官方 redis官网 redis中文网 redis中文命令网 redis模块 redis-github源码 redis报告 二.书籍 <Redis开发 ...