stringstream 将字符转化成整形
1. 简介
1.使用stringstream类前,先在头文件中添加 include
2.stringstream对象的使用和cout对象的使用相同
3.使用stringstream类前,先创建一个对象,并通过运算符“<<”将数据传给该对象
4.使用时调用 [对象名].str()就行了
主要用来进行数据类型转换,由于 使用 string 对象来代替字符数组(snprintf方式),就避免缓冲区溢出的危险;而且,因为传入参数和目标对象的类型会被自动推导出来,所以不存在错误的格式化符的问题。简单说,相比c库的数据类型转换而言, 更加安全、自动和直接。
2 代码示例
2.1 数据类型转换
这里展示一个代码示例,该示例介绍了将 int 类型转换为 string 类型的过程。示例代码
#include <sstream>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
stringstream sstream;
string str;
int value=37738347;
// 将int类型的值放入输入流中
sstream<<value;
// 从sstream中抽取前面插入的int类型的值,赋给string类型
sstream>>str;
cout<<str;
return 0;
}
编译并执行上述代码,结果如下:
同理将string转化成int
#include <sstream>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
stringstream sstream;
string str="15674865";
int value=0;
// 将string类型的值放入输入流中
sstream<<str;
// 从sstream中抽取前面插入的string类型的值,赋给int类型
sstream>>value;
printf("%d\n",value );
return 0;
}
重复利用stringstream对象
如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法;
在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。
在类型转换中使用模板
你可以轻松地定义函数模板来将一个任意的类型转换到特定的目标类型。例如,需要将各种数字值,如int、long、double等等转换成字符串,要使用以一个string类型和一个任意值t为参数的to_string()函数。to_string()函数将t转换为字符串并写入result中。使用str()成员函数来获取流内部缓冲的一份拷贝:
template<class T>
void to_string(string & result,const T& t)
{
ostringstream oss;//创建一个流
oss<<t;//把值传递如流中
result=oss.str();//获取转换后的字符转并将其写入result
}
这样,你就可以轻松地将多种数值转换成字符串了:
to_string(s1,10.5);//double到string
to_string(s2,123);//int到string
to_string(s3,true);//bool到string
可以更进一步定义一个通用的转换模板,用于任意类型之间的转换。函数模板convert()含有两个模板参数out_type和in_value,功能是将in_value值转换成out_type类型:
template<class out_type,class in_value>
out_type convert(const in_value & t)
{
stringstream stream;
stream<<t;//向流中传值
out_type result;//这里存储转换结果
stream>>result;//向result中写入值
return result;
}
这样使用convert():
double d;
string salary;
string s=”12.56”;
d=convert(s);//d等于12.56
salary=convert(9000.0);//salary等于”9000”
2.2 多个字符串拼接
本示例介绍在 stringstream 中存放多个字符串,实现多个字符串拼接的目的
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream sstream;
// 将多个字符串放入 sstream 中
sstream << "first" << " " << "string,";
sstream << " second string";
cout << "strResult is: " << sstream.str() << endl;
// 清空 sstream
sstream.str("");
sstream << "third string";
cout << "After clear, strResult is: " << sstream.str() << endl;
return 0;
}
编译并执行上述代码,结果如下:
从上述代码执行结果能够知道:
可以使用 str() 方法,将 stringstream 类型转换为 string 类型;
可以将多个字符串放入 stringstream 中,实现字符串的拼接目的;
如果想清空 stringstream,必须使用 sstream.str(""); 方式;clear() 方法适用于进行多次数据类型转换的场景。
注意:在本示例涉及的场景下(多次数据类型转换),必须使用 clear() 方法清空 stringstream,不使用 clear() 方法或使用 str("") 方法,都不能得到数据类型转换的正确结果。
clear()重置流的标志状态;str()清空流的内存缓冲,重复使用内存消耗不再增加!
在使用stringstream时遇到的问题:
#include <cstdlib>
#include <iostream>
#include <sstream>
using namespace std;
int main(int argc, char * argv[])
{
stringstream stream;
int a,b;
stream<<"80";
stream>>a;
stream<<"90";
stream>>b;
cout<<a<<endl;
cout<<b<<endl;
system("PAUSE ");
return EXIT_SUCCESS;
}
运行结果:
预期b为90,但是出现-858993460,这是由于stringstream重复使用时,没有清空导致的。
修改之后:
#include <cstdlib>
#include <iostream>
#include <sstream>
using namespace std;
int main(int argc, char * argv[])
{
stringstream stream;
int a,b;
stream<<"80";
stream>>a;
stream.clear();
stream<<"90";
stream>>b;
cout<<a<<endl;
cout<<b<<endl;
system("PAUSE ");
return EXIT_SUCCESS;
}
运行结果: