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用作传递键值可变长参数列表 函数调用 在调用函数时,使 ...
随机推荐
- Perl 语言入门1-5
第一章 简介 perl -v 文字处理,编写小型CGI脚本(Web服务器调用程序)的最佳语言 CPAN: Perl综合典藏网 shebang: #! /usr/bin/perl 或#! /usr/lo ...
- C#数据库连接方式【简版】
using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using ...
- typedef定义数组
typedef定义数组 问题来源 在学习高一凡数据结构与算法解析串这一章节时,遇到如下代码不明白其意义,经过查阅终于搞明白 typedef unsigned char SString[MAXLEN + ...
- 日常Java 2021/11/9
线程的优先级 每一个Java线程都有一个优先级,这样有助于操作系统确定线程的调度顺序.Java线程的优先级是一个整数,其取值范围是1(Thread.MIN_PRIORITY ) -10 (Thread ...
- 商业爬虫学习笔记day5
一. 发送post请求 import requests url = "" # 发送post请求 data = { } response = requests.post(url, d ...
- win10产品密钥 win10永久激活密钥(可激活win10所有版本)
https://www.win7w.com/win10jihuo/18178.html#download 很多人都在找2019最新win10永久激活码,其实win10激活码不管版本新旧都是通用的,也就 ...
- VUE页面实现加载外部HTML方法
前后端分离,后端提供了接口.但有一部分数据,比较产品说明文件,是存在其他的服务器上的.所以,在页面显示的时候,如果以页面内嵌的形式显示这个说明文件.需要搞点事情以达到想要的效果.本文主要和大家介绍VU ...
- Dubbo多版本控制
当系统进行升级时,一般都是采用"灰度发布(又称为金丝雀发布)"过程.即在低压力时段,让部分消费者先调用新的提供者实现类,其余的仍然调用老的实现类,在新的实现类运行没有问题的情况下, ...
- 【C/C++】二维数组的传参的方法/二维字符数组的声明,使用,输入,传参
[问题] 定义了一个子函数,传参的内容是一个二维数组 编译提示错误 因为多维数组作为形参传入时,必须声明除第一位维外的确定值,否则系统无法编译(算不出偏移地址) [二维数组的传参] 方法一:形参为二维 ...
- Redis学习推荐资料合集
目录 一.官方 二.书籍 三.推荐博客 一.官方 redis官网 redis中文网 redis中文命令网 redis模块 redis-github源码 redis报告 二.书籍 <Redis开发 ...