将变参格式化到一个string对象中

该小程序的功能是,仿照sprintf,将变参内容保存到string中。它演示了变参的用法。

/*
功能说明:
	仿照sprintf,将字符串格式化到一个string对象中。
实现方式:
	该例子主要是用来演示变参的用法。
	使用变参的时候,需要头文件stdarg.h,其使用方式为:va_start(),vsprintf(),va_end()按照顺序的结合。
	程序调用vsprintf将变参格式化到该临时字符数组中,然后再将此临时字符数组中的数据复制到string对象中。
限制条件或者存在的问题:
	程序在内存的堆中创建了一个临时字符数组,该字符数组的长度为2048个字节。
*/
#include <iostream>
#include <string>
#include <cstring>
#include <cstdarg>

using namespace std;

// 仿照sprintf,将字符串格式化到string中。
void formatString(string & s, const char *format, ...)
{
	size_t strMaxLen = 2048;
	char * tmp = new char[strMaxLen];
	memset(tmp, 0x00, strMaxLen);
	//为string赋值
	va_list list;
	va_start(list, format);
	//size_t len = vsnprintf(tmp, strMaxLen, format, list);
	size_t len = vsprintf(tmp, format, list);
	if (len >= strMaxLen)
	{
		tmp[strMaxLen - 1] = '\0';
	}
	va_end(list);
	s = tmp;
	delete[] tmp;
}

// 仿照sprintf,将字符串追加到string中。
void appendString(string & s, const char *format, ...)
{
	size_t strMaxLen = 2048;
	char * tmp = new char[strMaxLen];
	memset(tmp, 0x00, strMaxLen);
	//为string赋值
	va_list list;
	va_start(list, format);
	//size_t len = vsnprintf(tmp, strMaxLen, format, list);
	size_t len = vsprintf(tmp, format, list);
	if (len >= strMaxLen)
	{
		tmp[strMaxLen - 1] = '\0';
	}
	va_end(list);
	s.append(tmp);
	delete[] tmp;
}

int main(int argc, char **argv)
{
	cout << "process begin at " << (void*)&main << endl;

	string str;
	cout << "strlen is " << str.length() << endl;
	formatString(str, "Hello, world: %d, %lf  %s", 435, 5462.56 / 54, "man");
	cout <<"after format:" <<str << endl;
	appendString(str, "|Hello, world: %d, %lf  %s", 435, 5462.56 / 54, "man");
	cout <<"after append:"<< str << endl;

	return 0;
}


输出的结果为:

process begin at 01251541
strlen is 0
after format:Hello, world: 435, 101.158519  man
after append:Hello, world: 435, 101.158519  man|Hello, world: 435, 101.158519  man


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值