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;
}