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()函数是清空流的状态。