c++字符串操作之std::ostringstream踩坑日记

c++字符串操作之std::ostringstream踩坑日记

在开发过程中经常会遇到字符串操作,而std::string又没有format操作,这就很难受了。
于是我找到了std::ostringstream类;ostringstream类的用法也很简单,就是流操作。
头文件:include <sstream>
如:
int number = 14;
double ddata = 21.7;
char* pstr = "test";
std::ostringstream ostr;
ostr << "开始测试:" << std::endl;
ostr << "整形数据为:" << number << std::endl;
ostr << "浮点数为:" << ddata << std::endl;
ostr << "字符串为:" << pstr << std::endl;
std::cout << ostr.str();//str()是以std::string的形式返回

输出结果是这样的

开始测试:
整形数据为:14
浮点数为:21.7
字符串为:test

但是问题来了,通常一个变量或对象需要重复使用。那我要如何清除流中的数据呢?
一般的思路都是clear()。因为在STL容器里习惯都是clear()方法清空容器。所以第一反应都是用clear()方法来清除流中的数据。
试调用,ostr.clear();编译不报错(说明有这个方法存在,心想那就没错了,聪明的我一猜就对)。
int number = 14;
double ddata = 21.7;
char* pstr = "test";
std::ostringstream ostr;
ostr << "开始测试:" << std::endl;
ostr.clear();
ostr << "整形数据为:" << number << std::endl;
ostr.clear();
ostr << "浮点数为:" << ddata << std::endl;
ostr.clear();
ostr << "字符串为:" << pstr << std::endl;
ostr.clear();
std::cout << ostr.str();//str()是以std::string的形式返回

理论上说输出应该是这样的

字符串为:test

结果很打脸,无论我怎么调用clear()都无法清除ostr缓存中的数据。输出结果都是这样的:
开始测试:
整形数据为:14
浮点数为:21.7
字符串为:test

经过一番查找资料发现,原来在STL的所有流中clear的含义均为清空错误标记!并非是清空容器。。。
巨坑,习惯性的认为clear()方法就是清空内容,但实际上他是清除错误标记。
那我需要清空内容该如何呢?
需要用void str ( const string & s )方法,该方法是重新给ostringstream灌新值的意思。
如:

int number = 14;
double ddata = 21.7;
char* pstr = "test";
std::ostringstream ostr;
ostr << "开始测试:" << std::endl;
ostr.str("");
ostr << "整形数据为:" << number << std::endl;
ostr.str("");
ostr << "浮点数为:" << ddata << std::endl;
ostr.str("");
ostr << "字符串为:" << pstr << std::endl;
ostr.str("");
std::cout << ostr.str();//str()是以std::string的形式返回

输出结果为:

字符串为:test

神奇吧。。。
同理 ostr.str(“Hello”)将会使ostr中的内容为"Hello"。但注意:ostr.str(“Hello”); ostr << “World”;的执行结果将会变成"World"而不是"HelloWorld"。

相信不少程序猿都踩过这个坑吧!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值