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;
}
posted @ 2021-03-26 23:23  mohist  阅读(409)  评论(0编辑  收藏  举报