您的位置:首页 > 其它

一种std::string的格式化方法

2016-03-03 17:00 281 查看
使用标准库中string的好处是不用自己管理内存,很多场景下通过sprintf来格式化字符串时也存在不能预先申明char数组长度的问题,需要自己来管理字符串内存的申请与释放。而标准库std中并没有类似CString::Format()这样的接口,很多文章中提到利用istream、ostream一类的来格式化字符串则复杂繁琐。因此思考后决定自己写一个格式化std::string的通用函数:

#include <string>

std::string & std_string_format(std::string & _str, const char * _Format, ...){
va_list marker = NULL;
va_start(marker, _Format);

int num_of_chars = _vscprintf(_Format, marker);

if (num_of_chars > _str.capacity()){
_str.resize(num_of_chars + 1);
}

vsprintf((char *) _str.c_str(), _Format, marker);

va_end(marker);
return _str;
}

利用这个函数可以很轻松地进行string字符串的格式化了,而且非常简洁!

2016-05-24 发现按上述方法设置std::string后,虽然字符内容是正确的,但string的size属性没有对应改过来,所以修改为:

std::string & std_string_format(std::string & _str, const char * _Format, ...) {
std::string tmp;

va_list marker = NULL;
va_start(marker, _Format);

size_t num_of_chars = _vscprintf(_Format, marker);

if (num_of_chars > tmp.capacity()) {
tmp.resize(num_of_chars + 1);
}

vsprintf_s((char *)tmp.data(), tmp.capacity(), _Format, marker);

va_end(marker);

_str = tmp.c_str();
return _str;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: