探究std::stringstream

本文详细介绍了C++中stringstream的应用技巧,包括如何通过stringstream进行字符串与数值间的转换、如何避免常见陷阱以及如何正确地使用stringstream进行数据解析。文章还讨论了不同数据类型在处理过程中的注意事项。
摘要由CSDN通过智能技术生成

string myStr(“98 99 999”);
stringstream strStream;
strStream>>myStr;
int a, b, c;
strStream>>a>>b>>c;
a = 98 b = 99 c = 999;
这都比较好理解 ,但正好有个变量是unsigned char类型的。
char d;
strStream>>d;
printf(“d=%d”, d);
打印结果是57, 其实d=’9’,对应的十进制就是57;
但初衷是想d=98,但d又是unsigned char不能改数据类型
首先想到一个外门邪道,让代码尽量简洁些
strStream>>(int&)d;
就是定义个临时变量,是d的引用。这有引发了另一个问题
int& e = (int&)d
这种数据类型不匹配,会不会造成越界?
验证一下
char f[9] = {0};
int& e = f[5];
e = 0x1111111;
printf(“%d %d %d %d %d”, f[5], f[6], f[7], f[8]);
打印结果 17 17 17 17
显然e改变了一个整型。这种方法显然是错误的。
while(strStream>>d) {
//连续按照空格解析
}
还有一点是说
strStream《string(“122”)
strStream.clear();//要先clear()
strStream《string(“133”)
另外strStream的构造和析构比较耗CPU,使用时注意一下

2018/1/9:在C++11 to_string转换之前,使用 stringstream将数字转换成字符串,代码存在bug最近才暴露出来
stringstream sstream;
sstream<<6.7;
const char* dst = sstream.str().c_str()
sstream.str(“”); //清空原有内容
sstream<<7.8;
const char* dst2 = sstream.str().c_str();
pintf(“dst1:%s, dst2:%s”, dst, dst2);//有问题,dst指向的内容其实已经清除了。

还有一种是使用to_string,比如
const char* str = std::to_string(2).c_str();
printf(“str:%s”, str); //有问题std::to_string(2) 返回的是临时变量,其实这条语句执行完这个变量其实就已经释放的

所以在使用stringstream 和 to_string的时候明确生命周期。

str(“”)是清空内容,clear()函数是清空流的状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值